Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”

一、问题描述

使用Retrofit+LeanCloud$RESTApi形式作为数据请求方式。

1. 错误提示

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第1张图片

2. RESTAPI

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第2张图片

二、封装方式:

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. 设置认证方式

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第3张图片

2. 配置Header

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第4张图片

3. 设置body

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第5张图片

四、错误处理

目前仍未找出问题所在。你 你知道吗? 请不吝赐教。 

---------------------------------------------------------------------------

---------------------------------------------------------------------------

问题解决:

在封装的时候,使用的是@Body, 然后用一个自定义类型,如User,但是通过打印,这个Body没有被传入到Http请求中。因为打印出的body为空的。打印出这个:{} 。然后LeanCloud就认为该次请求不合法。并提示“Http 400 bad request”。 

Retrofit官网对@Body的说明:

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第6张图片

从文档上看,只要指定Converter就可以通过Converter来转换@Body的类型的,转换为json字串。但是我添加了转换器,为什么转换出来的body为空呢。是转换器自身有问题,还是自定义的Body类型有问题,不得而知。

但是,如果自定义的Body类型有问题,将这个自定义类型的对象转换为json后,再传入RequestBody后,为什么又可以正常工作呢???

Retrofit初始化:是指定了Converter的。

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第7张图片

Converter转换器版本:

最后把@Body的类型改为RequestBody,然后手动生成RequestBody对象,就正常了。

手动生成RequestBody:

REST请求终于正常了:

Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”_第8张图片

先使用RequestBody作为@Body的类型,后续如果发现解决办法了,再来告诉大家。

如果你知道自定义类型为什么不能正常工作,也麻烦你留言。非常感谢!!

你可能感兴趣的:(Retrofit+LeanCloud$RestApi提示“Http 400 Bad Request”)