如何解决 com.jakewharton.retrofit2.adapter.rxjava2.HttpException



我有这个 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}")
      }
   })
}

邮递员电话

邮递员标题

NetsPayCheckOutNetsPayData类:

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 中的 FormUrlEncoding 是"x-www-form-urlencoded"选项卡(。从getNestPayCheckOut中删除@FormUrlEncoded注释应该会有所帮助。

如果没有,调试此类错误的一种有用方法是使用类似 https://www.charlesproxy.com/的代理。它将允许您查看从手机/应用程序发出的HTTP请求,并将其与Postman发送的内容进行比较。

作为旁注,如果@FormUrlEncoded确实是导致问题的原因,我建议您修改您的服务器,使其仅接受编码字段:这样,如果您的字段包含"="和"&"等特殊字符,您将不会遇到任何问题

最新更新