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

来源:互联网 发布:武汉大学网络 编辑:程序博客网 时间:2024/06/03 09:25

新人,这几天学习了一下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);//调用方法得到一个CallgetData.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());                        }                    });