一、問題描述
使用Retrofit+LeanCloud$RESTApi形式作為數(shù)據(jù)請求方式轴脐。
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調(diào)用
userApi.createUser("retrofit","123456").subscribe(newAction1() {
@Override
public voidcall(UserEntity userEntity) {
}
},newAction1() {
@Override
public voidcall(Throwable throwable) {
Timber.tag(TAG).e(throwable);
}
});
三、調(diào)試(Postman App)
1. 設(shè)置認(rèn)證方式
2. 配置Header
3. 設(shè)置body
四唁盏、錯誤處理
目前仍未找出問題所在蚕苇。你 你知道嗎哩掺? 請不吝賜教。?
---------------------------------------------------------------------------
---------------------------------------------------------------------------
問題解決:
在封裝的時候涩笤,使用的是@Body嚼吞, 然后用一個自定義類型,如User蹬碧,但是通過打印舱禽,這個Body沒有被傳入到Http請求中。因為打印出的body為空的恩沽。打印出這個:{} 誊稚。然后LeanCloud就認(rèn)為該次請求不合法。并提示“Http 400 bad request”罗心。?
Retrofit官網(wǎng)對@Body的說明:
從文檔上看里伯,只要指定Converter就可以通過Converter來轉(zhuǎn)換@Body的類型的,轉(zhuǎn)換為json字串渤闷。但是我添加了轉(zhuǎn)換器疾瓮,為什么轉(zhuǎn)換出來的body為空呢。是轉(zhuǎn)換器自身有問題飒箭,還是自定義的Body類型有問題狼电,不得而知。
但是弦蹂,如果自定義的Body類型有問題肩碟,將這個自定義類型的對象轉(zhuǎn)換為json后,再傳入RequestBody后凸椿,為什么又可以正常工作呢削祈??削饵?
Retrofit初始化:是指定了Converter的岩瘦。
Converter轉(zhuǎn)換器版本:
最后把@Body的類型改為RequestBody未巫,然后手動生成RequestBody對象,就正常了启昧。
手動生成RequestBody:
REST請求終于正常了:
先使用RequestBody作為@Body的類型叙凡,后續(xù)如果發(fā)現(xiàn)解決辦法了,再來告訴大家密末。
如果你知道自定義類型為什么不能正常工作握爷,也麻煩你留言。非常感謝Q侠铩新啼!