一、問題描述
使用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的類型,后續(xù)如果發(fā)現解決辦法了,再來告訴大家。
如果你知道自定義類型為什么不能正常工作,也麻煩你留言。非常感謝!!