android - 如何解决 com.jakewharton.retrofit2.adapter.rxjava2.HttpException: HTTP 422 Unprocessable Entity in FormUrlEncoded
问题描述
我有这个 API 接口
@FormUrlEncoded
@Headers("Accept: application/json;charset=UTF-8")
@POST("checkout/guest/netspay")
fun getNestPayCheckOut(
@Field("outlet_id") outLetId: String,
@Field("order_type") orderType:String,
@Field("products") products:String,
@Field("pickup_time") pickUpTime:String,
@Field("total_price_tax") totalPrice:String,
@Field("order_note") orderNote:String,
@Field("name") name:String,
@Field("email") email:String,
@Field("phone") phone:String
):Observable<NetsPayCheckOut>
这就是我执行 API 调用的方式
fun getNetsPayGuestCheckOut(
outletId:String, orderType:String,
products:String, pickUpTime:String,
name:String,email:String,
phone:String, totalPrice:String,
note:String,
mNetsCheckOut:MutableLiveData<NetsPayCheckOut>,
mErrorLD: MutableLiveData<Error>
){
mTheApiNew.getNestPayCheckOut(
outletId,orderType,
products,pickUpTime,
name,email,
phone,totalPrice,
note
)
.subscribeOn(scheduler)
.observeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<NetsPayCheckOut> {
override fun onComplete() { }
override fun onSubscribe(d: Disposable) { }
override fun onNext(response: NetsPayCheckOut) {
if(response.status!!){
mNetsCheckOut.value= response
} else {
mErrorLD.value= ServerError(response.message!!)
Log.e("checkout","${response.status} and ${response.message}")
}
}
override fun onError(e: Throwable) {
mErrorLD.value= FailureError(e.message!!)
Log.e("checkout","${e.message} and ${e.localizedMessage}")
}
})
}
NetsPayCheckOut
&NetsPayData
班级:
import com.google.gson.annotations.SerializedName
data class NetsPayCheckOut(
val code: Int? = null,
@SerializedName("data")
val netsPayData: NetsPayData? = null,
val message: String? = null,
val status: Boolean? = null
)
data class NetsPayData(
val secretKey: String? = null,
val txnReq: String? = null,
val keyId: String? = null
)
但我总是收到这个错误
com.jakewharton.retrofit2.adapter.rxjava2.HttpException:HTTP 422 无法处理的实体
解决方案
异常告诉您,您的服务器以 HTTP 错误 422 响应。这意味着您的请求正确到达您的服务器,但无法正确处理。
根据 Postman 屏幕截图和 Retrofit 声明,我可以看到您声明了您的请求@FormUrlEncoded
,但在 Postman 中您发送了未编码的那些字段(Postman 中 FormUrlEncoded 的等效项是“x-www-form-urlencoded”选项卡)。@FormUrlEncoded
从您的注释中删除getNestPayCheckOut
应该会有所帮助。
如果没有,调试此类错误的一种有用方法是使用像https://www.charlesproxy.com/这样的代理。它将允许您查看手机/应用程序发出的 HTTP 请求,并将其与 Postman 发送的内容进行比较。
作为旁注,如果@FormUrlEncoded
确实是导致问题的原因,我建议修改您的服务器,使其仅接受编码字段:这样,如果您的字段包含特殊字符(如“=”和“ &"
推荐阅读
- microsoft-graph-api - Microsoft Graph API - 无法以 endwith 过滤
- python - PyQt5 为每个组合框选项呈现不同的复选框集
- google-analytics - Google 跟踪代码管理器引荐主机名
- angular - 在角度使用 proxy.conf.json 是一个好习惯吗?
- mvvm-light - Windows Template Studio MVVMLight 从详细信息页面访问 ViewModel
- python - 不确定我的 Python/numpy 版本是否使用优化的 BLAS/LAPACK 库?
- c# - 在实体框架中插入多对多的链接表
- mysql - Laravel whereRaw 绑定运算符
- android - android SMS读取权限问题
- sas - sql到proc sql转换