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());
                    }

                })

回调函数中的泛型对应的就是响应实体类,如果你弄成了请求实体类……(先哭一会,找了一下午)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值