分享下我用Retrofit + Rxjava请求后台数据时遇到的问题

新人,这几天学习了一下Retrofit + RxJava + OkHttp  实现网络请求。如果写的不好望各位见谅!

下面我们进入正题:


关于使用Retrofit + RxJava + Okhttp 请求网络的一些基本的知识请看 http://www.jianshu.com/p/94f6370ed18d?from=timeline&isappinstalled=1

我在使用Retrofit + RxJava + OkHttp的时候遇到的问题主要有以下几个 希望能给遇到类似的小伙伴们一点帮助

我在请求我们服务器的数据的时候因为我们服务器接收的数据是json格式的所以在请求网络的时候要重新设置一下Content-Type不然默认的Content-Type的值为Text这样的话就会访问不了我们自己的服务器且返回415,在这里困扰了我好几个小时。通过查看好多资料最后我通过RequestBody中的MediaType将Content-Type的值设置成

application/json

代码:

RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), String.valueOf(jsonObject));

然后将这个请求体传入定义的retrofit接口的请求后台数据的方法中结果就能拿到数据了

retrofit的接口如下:

public interface GetData {

    @POST("sendCaptcha.html")
    Observable<Object> getCaptcha(@Body RequestBody requestBody);

请求后台数据的代码:

GetData getData = retrofit.create(GetData.class);

//调用方法得到一个Call
getData.getCaptcha(requestBody)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<Object>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

                Log.e("TAG", "请求失败了 : " + e.toString());

            }

            @Override
            public void onNext(Object movieSubject) {

                Log.e("TAG", "请求成功了 ");
                Log.e("TAG", "请求成功了返回码是: " + movieSubject.toString());

            }
        });

其实还可以添加拦截器来解决MediaType 与自己的后台不匹配的问题 OkHttp中可以添加应用拦截器(在发出网络请求之前进行拦截 可以修改在发出网络请求之前的一些操作) 和网络拦截器(发出网络之后且收到从服务器返回的信息    可以对服务器返回的数据进行过滤等操作)代码如下


比如这个时候的retrofit中定义的方法为

public interface GetData {

    @FormUrlEncoded
    @POST("sendCaptcha.html")
    Observable<Object> getCaptcha(
                                  @Field("reqtime") String reqtime,
                                  @Field("user") String user,
                                  @Field("data") Map<String, String> map
    );


下面是具体的请求后台数据部分的代码:


final RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), String.valueOf(jsonObject));
//        网络拦截器和应用拦截器(这里为了测试所以就把网络拦截器和应用拦截器公用了)
            Interceptor mNetInterceptor = new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {

                    Request request = chain.request();

                    request = request.newBuilder()
                            //Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。为了确保缓存生效
                            .post(requestBody)
                            .build();
                    return chain.proceed(request);
                }
            };

            OkHttpClient mClient = new OkHttpClient.Builder()
                    .addInterceptor(mNetInterceptor)//应用程序拦截器(网络请求发出之前进行拦截)
//                    .addNetworkInterceptor(mNetInterceptor)//网络拦截器(网络应答之后进行拦截)
                    .build();

            retrofit = new Retrofit.Builder()
                    .baseUrl("你的BaseUrl")
                    .client(mClient)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();


            GetData getData = retrofit.create(GetData.class);

            //调用方法得到一个Call
            getData.getCaptcha(System.currentTimeMillis() + "","用户名",map)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Subscriber<Object>() {
                        @Override
                        public void onCompleted() {

                        }

                        @Override
                        public void onError(Throwable e) {

                            Log.e("TAG", "请求失败了 : " + e.toString());

                        }

                        @Override
                        public void onNext(Object movieSubject) {

                            Log.e("TAG", "请求成功了 ");
                            Log.e("TAG", "请求成功了返回码是: " + movieSubject.toString());

                        }
                    });                 




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值