一、问题描述
使用Retrofit+LeanCloud$RESTApi形式作为数据请求方式。
1. 错误提示
2. RESTAPI
二、封装方式:
1. OKHttpClient:
OKHttpClient client=newokhttp3.OkHttpClient.Builder()
.addInterceptor(newLeanCloudInterceptor())
.addInterceptor(loggingInterceptor)
.build();
2. OKHttp interceptor
public classLeanCloudInterceptorimplementsInterceptor {
@Override
publicResponse intercept(Chain chain)throwsIOException {
Request request = chain.request()
.newBuilder()
.addHeader("X-LC-Id","1phFDb13NgorRUYU3DH8qPEJgzGzoHsz")
.addHeader("X-LC-Key","3vCikOfQxO82jgaORYpdzQpQ")
.addHeader("Content-Type","application/json")
.build();
returnchain.proceed(request);
}
}
3. Retrofit
Retrofit retrofit=newRetrofit.Builder()
.baseUrl("https://leancloud.cn:443/1.1/")
.client(OKHttpClient.INSTANCE.getClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
4. ApiService
@POST("users")
Observable createUser(@BodyUserReqBody body);
5. ApiService封装
publicObservable createUser(String username, String password){
UserReqBody body = UserReqBody.newBuilder()
.username(username)
.password(password)
.build();
returnuserRest.createUser(body).subscribeOn(Schedulers.io());
}
6. Api调用
userApi.createUser("retrofit","123456").subscribe(newAction1() {
@Override
public voidcall(UserEntity userEntity) {
}
},newAction1() {
@Override
public voidcall(Throwable throwable) {
Timber.tag(TAG).e(throwable);
}
});
三、调试(Postman App)
1. 设置认证方式
2. 配置Header
3. 设置body
四、错误处理
目前仍未找出问题所在。你 你知道吗? 请不吝赐教。
---------------------------------------------------------------------------
---------------------------------------------------------------------------
问题解决:
在封装的时候,使用的是@Body, 然后用一个自定义类型,如User,但是通过打印,这个Body没有被传入到Http请求中。因为打印出的body为空的。打印出这个:{} 。然后LeanCloud就认为该次请求不合法。并提示“Http 400 bad request”。
Retrofit官网对@Body的说明:
从文档上看,只要指定Converter就可以通过Converter来转换@Body的类型的,转换为json字串。但是我添加了转换器,为什么转换出来的body为空呢。是转换器自身有问题,还是自定义的Body类型有问题,不得而知。
但是,如果自定义的Body类型有问题,将这个自定义类型的对象转换为json后,再传入RequestBody后,为什么又可以正常工作呢???
Retrofit初始化:是指定了Converter的。
Converter转换器版本:
最后把@Body的类型改为RequestBody,然后手动生成RequestBody对象,就正常了。
手动生成RequestBody:
REST请求终于正常了:
先使用RequestBody作为@Body的类型,后续如果发现解决办法了,再来告诉大家。
如果你知道自定义类型为什么不能正常工作,也麻烦你留言。非常感谢!!