Retrofit 使用過程中遇到的問題

Post提交Json

普通post提交參數 使用@Field 或者 @FieldMap

@FormUrlEncoded 
@POST("login") 
Call<String> login(@Field("loginName") String name, 
    @Field("password") String password);
//loginName password 是接口中的參數名稱


@FormUrlEncoded
@POST("login")
Call<LoginBean> login2(@FieldMap Map<String,String>params); 

Post Json 使用@Body ,

interface LoginService {
    @Headers("Content-Type: application/json")//需要添加Header
    @POST("login")
    // 請求體RequestBody 類型
    fun login(@Body info: RequestBody): Call<LoginResponseEnt>
}

Could not locate ResponseBody converter

Post json過程中遇到這麼一個問題

  Caused by: java.lang.IllegalArgumentException: Could not locate
  ResponseBody converter for class com.xxx.LoginResponseEnt.

出現這個問題的原因是因爲缺少ConverterFactory,所以要addConverterFactory

Retrofit.Builder().baseUrl(Constant.LoginUrl)
.addConverterFactory(GsonConverterFactory.create()) //不要忘了這句 
.build();

實體類

區分請求實體類 和 響應實體類(有沒有這兩個名詞不重要:)),請求實體類存放請求參數的實體類,響應實體類存放返回結果的實體類

請求實體類

post json 數據

 var info: LoginRequestEnt = LoginRequestEnt("86", phone, pwd);
  /*** 利用Gson 將對象轉json字符串*/
 var gson: Gson = Gson();
 var obj: String = gson.toJson(info)
 val body: RequestBody = RequestBody.create(
     okhttp3.MediaType.parse("application/json;charset=utf-8"), obj)

info 所對應的 LoginRequestEnt 就是請求實體類

響應實體類

Retrofit 要求 turns your HTTP API into a Java interface.

 interface LoginService {
    @Headers("Content-Type: application/json")//需要添加Header
    @POST("login")
    // 請求體RequestBody 類型
    fun login(@Body info: RequestBody): Call<LoginResponseEnt>    
}

LoginResponseEnt 就是響應實體類

爲什麼說這兩個類,因爲這兩個類很重要,直接影響請求結果 和 響應結果
重點記錄一下響應實體類

data.enqueue(object : retrofit2.Callback<LoginResponseEnt> {
                    // 成功時調用
                    override fun onResponse(call: Call<LoginResponseEnt>?, response: Response<LoginResponseEnt>?) {

                        if (null != response) {
                            if (response.isSuccessful) {
                                Log.e("LoginActivity", "onResponse: --ok--" );
                            } else {
                                onFailure(call, RuntimeException("response error,detail = " + response.raw().toString()));
                            }
                        } else {
                            onFailure(call, RuntimeException("response error,detail = 請求失敗"));
                        }
                    }

                    // 失敗時調用
                    override fun onFailure(call: Call<LoginResponseEnt>?, t: Throwable?) {
                        Log.d("LoginActivity", "onResponse: --err--" + t.toString());
                    }

                })

回調函數中的泛型對應的就是響應實體類,如果你弄成了請求實體類……(先哭一會,找了一下午)

發佈了58 篇原創文章 · 獲贊 44 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章