新人,这几天学习了一下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()); } });