Как решить com.jakewharton.retrofit2.adapter.rxjava2.HttpException: HTTP 422 необработанный объект в FormUrlEncoded - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть этот интерфейс 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 Необработанный объект

1 Ответ

1 голос
/ 23 апреля 2019

Исключение говорит вам, что ваш сервер ответил с ошибкой HTTP 422. Это означает, что ваш запрос достиг вашего сервера правильно, но он не мог быть обработан правильно.

Основываясь на снимке экрана Postman и объявлении Retrofit, я вижу, что вы объявляете свой запрос @FormUrlEncoded, но в Postman вы отправляете те поля, не закодированные (эквивалентом FormUrlEncoded в Postman является "x-www-form-urlencoded" вкладка). Удаление аннотации @FormUrlEncoded из вашего getNestPayCheckOut должно помочь.

Если нет, то одним из полезных способов отладки таких ошибок является использование прокси-сервера, например https://www.charlesproxy.com/.. Это позволит вам увидеть HTTP-запросы, сделанные с вашего телефона / приложения, и сравнить их с тем, что отправляет Postman.

В качестве дополнительного примечания: если @FormUrlEncoded действительно является причиной проблемы, я бы порекомендовал изменить ваш сервер так, чтобы он принимал только закодированные поля: таким образом, у вас не возникнет никаких проблем, если ваши поля содержат специальные символы как "=" и "&"

...