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());
}
})
回调函数中的泛型对应的就是响应实体类,如果你弄成了请求实体类……(先哭一会,找了一下午)