Модернизация не удается опубликовать на samsung s3 версии android 4.0.4 в то время как на данных

У меня есть приложение для Android, которое хорошо работает на других устройствах Android, но оно не работает на samsung s3, работающем под управлением Android версии 4.0.4 на данных. Retrofit throws 404 (страница не найдена ошибка), но страница существует, и если я делаю такой же запрос на Wi-Fi, она работает хорошо. Любой, кто имеет представление о том, что может быть неправильным. благодаря

Ниже найдите трассировку стека

retrofit.RetrofitError: 404 Not Found at retrofit.RestAdapter$RestHandler.invokeRequest (RestAdapter.java:388) at retrofit.RestAdapter$RestHandler.access$100 (RestAdapter.java:220) at retrofit.RestAdapter$RestHandler$2.obtainResponse (RestAdapter.java:278) at retrofit.CallbackRunnable.run (CallbackRunnable.java:42) at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:569) at retrofit.Platform$Android$2$1.run (Platform.java:142) at java.lang.Thread.run (Thread.java:856) 

Ниже приведен код, который я использую для вызова

  val tailorsInterface = RestAdapter.Builder() .setEndpoint(resources.getString(R.string.base_url)) .build().create(TailorsInterface::class.java) tailorsInterface.addTailor(txtName.text.toString(), txtEmail.text.toString(), Utils.parsePhone(txtPhone.text.toString(), "254"), txtAddress.text.toString(), txtLon.text.toString(), txtLat.text.toString(), txtPassword.text.toString(), Common.LOCATIONS!!.get(spTowns.selectedItemPosition).id, object : Callback<DefaultResponse> { override fun success(defaultResponse: DefaultResponse, response: Response) { dialog.hide() if(defaultResponse.success == 1.toLong()){ val alertDialog: AlertDialog val builder = AlertDialog.Builder(this@TailorsRegisterActivity) .setTitle(resources.getString(R.string.app_name)) .setMessage("Tailor successfully registered, click OK to continue to login") .setPositiveButton("OK") { dialog, which -> run{dialog.dismiss() val loginIntent: Intent = Intent(this@TailorsRegisterActivity, TailorsLoginActivity::class.java) startActivity(loginIntent) } } alertDialog = builder.create() alertDialog.show() }else{ val alertDialog: AlertDialog val builder = AlertDialog.Builder(this@TailorsRegisterActivity) .setTitle(resources.getString(R.string.app_name)) .setMessage("An Error occurred please try again later") .setPositiveButton("OK") { dialog, which -> run{dialog.dismiss() finish()} } alertDialog = builder.create() alertDialog.show() } } @FormUrlEncoded @POST("/tailors") public fun addTailor(@Field("name") name: String, @Field("email") email: String, @Field("phone") phone: String, @Field("address") address: String, @Field("lon") lon: String, @Field("lat") lat: String, @Field("password") password: String, @Field("town") town: Int, cb: Callback<DefaultResponse>) data class DefaultResponse ( var success: Long, var message: String ) 

После многих дней отладки, пытаясь выяснить, в какой проблеме я наконец нашел решение, проблема не модифицирована, но это веб-сервер, который я использую. У меня есть приложение, сделанное в clojure, и я использую http-kit в качестве своего веб-сервера и compojure для маршрутизации.

По какой-то причине запросы, поступающие с s3, uri в карте запроса http-kit также включают в себя хост, поэтому он не сопоставляется ни с одним из маршрутов моего развороты. Например, скажем, если маршрут, который я ищу, это /login uri в карте запроса http-kit для запроса, поступающего из s3, содержит http://example.com/login но с других телефонов, которые он содержит /login . Следовательно, uri не соответствует ни одному из моих маршрутов, которые я определил в defroute compojure, и идет прямо к не найденному, и, следовательно, ошибка 404

Решение

Чтобы решить эту проблему, мне пришлось расширить Compojure routes.clj и добавить следующую функцию

 (defn other-found "if for some reason the route is defined and is not found " [body] (fn [request] (-> (response/render body request) (status 200) (cond-> (= (:request-method request) :head) (assoc :body nil))))) 

В defroute, если uri не сопоставлен, я использую функцию other-found и передаю ей функцию not-found-page (вы можете назвать эту функцию так, как вы хотите ее назвать) в функции, которую я получаю uri из параметра запроса разобрать его и получить конечную точку, затем использовать condp для сопоставления конечной точки с соответствующей функцией.

Надеюсь, это поможет кому-то с аналогичной проблемой.