在使用数据时,在 samsung s3 android 版本 4.0.4 上改造 post 失败
Retrofit failing to post on samsung s3 android version 4.0.4 while on data
我有一个 android 应用程序在其他 android 设备上运行良好,但它在 samsung s3 运行 android 版本 4.0.4 数据上失败。 Retrofit 抛出 404(页面未找到错误)但页面存在,如果我在 wifi 上发出相同的请求,它运行良好。任何知道什么可能行为不端的人。谢谢
请在堆栈跟踪下方找到
retrofit.RetrofitError: 404 Not Found
at retrofit.RestAdapter$RestHandler.invokeRequest (RestAdapter.java:388)
at retrofit.RestAdapter$RestHandler.access0 (RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler.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.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 的请求在 http-kit 请求映射中的 uri 也包括主机,因此它没有被映射到我的 defroute 上的任何路由。例如,如果我要查找的路由是 /login
,则来自 s3 的请求的 http-kit 请求映射中的 uri 包含 http://example.com/login
,但来自其他手机的请求包含 /login
.因此,uri 与我在 compojure defroute 中定义的任何路线都不匹配,直接进入未找到状态,因此出现 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
(您可以随意命名此函数)在函数 I从请求参数中获取 uri 解析它并获取端点,然后使用 condp
将端点映射到适当的函数。
希望这对遇到类似问题的人有所帮助。
我有一个 android 应用程序在其他 android 设备上运行良好,但它在 samsung s3 运行 android 版本 4.0.4 数据上失败。 Retrofit 抛出 404(页面未找到错误)但页面存在,如果我在 wifi 上发出相同的请求,它运行良好。任何知道什么可能行为不端的人。谢谢
请在堆栈跟踪下方找到
retrofit.RetrofitError: 404 Not Found
at retrofit.RestAdapter$RestHandler.invokeRequest (RestAdapter.java:388)
at retrofit.RestAdapter$RestHandler.access0 (RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler.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.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 的请求在 http-kit 请求映射中的 uri 也包括主机,因此它没有被映射到我的 defroute 上的任何路由。例如,如果我要查找的路由是 /login
,则来自 s3 的请求的 http-kit 请求映射中的 uri 包含 http://example.com/login
,但来自其他手机的请求包含 /login
.因此,uri 与我在 compojure defroute 中定义的任何路线都不匹配,直接进入未找到状态,因此出现 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
(您可以随意命名此函数)在函数 I从请求参数中获取 uri 解析它并获取端点,然后使用 condp
将端点映射到适当的函数。
希望这对遇到类似问题的人有所帮助。