Retrofit+LeanCloud$RestApi提示“Htt

作者: marine8888 | 来源:发表于2016-11-30 19:51 被阅读2398次

    一、问题描述

    使用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的类型,后续如果发现解决办法了,再来告诉大家。

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

    相关文章

      网友评论

        本文标题:Retrofit+LeanCloud$RestApi提示“Htt

        本文链接:https://www.haomeiwen.com/subject/rlvtmttx.html