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());
}
})
回調函數中的泛型對應的就是響應實體類,如果你弄成了請求實體類……(先哭一會,找了一下午)