okhttp3相关封装配置(二):Request对象

在Android开发框架中,比较重要的一个模块,就是网络请求模块。一个封装比较好的网络请求框架,会让开发者在发送请求和处理回调都十分方便。这篇文章就围绕着使用比较广泛的okhttp3来写,声明一下,本人不是大神,所以封装的并不完善,只是想给大家共享一下这个小小的成果。

我打算以3篇文章来介绍我是怎么封装okhttp3这个框架的,就是围绕着OkHttpClient, request, callback这三个主题来写。

本篇文章来配置request


上一篇文章已经介绍,okHttp3框架发送请求是通过调用OkHttpClient的newCall()方法,来传入Request对象实现的。
那么Request对象里面都有什么,接下来给大家介绍一下。
Request对象,主要配置:请求Url, 请求头, 请求参数
我封装了一个Request工具类,用来封装适用于Get请求和Post请求,看代码:

Get请求:

    public static Request createGetRequest(String url, RequestParams params, RequestParams headers){
        StringBuilder urlBuilder = new StringBuilder(url).append("?");
        if(params != null){
            for(Map.Entry<String, String> entry: params.urlParams.entrySet()){
                urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        //添加请求头
        Headers.Builder mHeaderBuild = new Headers.Builder();
        if (headers != null) {
            for (Map.Entry<String, String> entry : headers.urlParams.entrySet()) {
                mHeaderBuild.add(entry.getKey(), entry.getValue());
            }
        }
        Headers mHeader = mHeaderBuild.build();
        Request request = new Request.Builder().url(urlBuilder.substring(0, urlBuilder.length() - 1)).get().headers(mHeader).build();
        Log.e("fangming", "requestUrl: " + request.url());

        return request;
    }

说明:
Get请求大家应该都熟悉,就是将参数拼接到Url后边。
Headers.Builder是okHttp3框架中用来生成请求头的构建类,将请求头参数以键值对的方式put进去即可。
接下来创建Request对象,传入拼接好的Url和创建的Header。就可以构建了Request对象了。

Post请求:

    public static Request createPostRequest(String url, RequestParams params, RequestParams headers){
        FormBody.Builder mFormBodyBilder = new FormBody.Builder();
        if(params != null){
            for(Map.Entry<String, String> entry: params.urlParams.entrySet()){
                //将请求参数遍历添加到请求构建类中
                mFormBodyBilder.add(entry.getKey(), entry.getValue());
            }
        }
        //添加请求头
        Headers.Builder mHeaderBuild = new Headers.Builder();
        if (headers != null) {
            for (Map.Entry<String, String> entry : headers.urlParams.entrySet()) {
                mHeaderBuild.add(entry.getKey(), entry.getValue());
            }
        }

        //获取真正的请求体
        FormBody mFormBody = mFormBodyBilder.build();
        Headers mHeader = mHeaderBuild.build();
        Request request = new Request.Builder().url(url).post(mFormBody).headers(mHeader).build();
        Log.e("fangming", "requestUrl: " + request.url());

        return request;
    }

说明:
Post请求跟Get请求不同,参数并不是直接拼接在Url之后,而是通过FormBody对象中,使用方法与Header对象相同,都是将键值对put进去。
然后创建Request对象,传入Url,FormBody和Header。就可以构建了Request对象了。

请求头和参数对象RequestParams是我查找资源后封装的一个集合对象类 ,里面加了一些异常处理和循环处理,其实使用普通的Map<String, String>就可以。


okHttp3框架中,使用的都是创建者模式来创建对象,例如:OkHttpClient.Builder,FormBody.Builder(),Headers.Builder(),Request.Builder()。创建者模式又称建造者模式,是用来创建复杂对象的良策,虽然这个设计模式的使用并不多,但是还是了解一下比较好,这里就不多介绍了。

package com.zhy.http.okhttp; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import com.zhy.http.okhttp.cookie.SimpleCookieJar; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Response; import com.zhy.http.okhttp.builder.GetBuilder; import com.zhy.http.okhttp.builder.PostFileBuilder; import com.zhy.http.okhttp.builder.PostFormBuilder; import com.zhy.http.okhttp.builder.PostStringBuilder; import com.zhy.http.okhttp.callback.Callback; import com.zhy.http.okhttp.https.HttpsUtils; import com.zhy.http.okhttp.request.RequestCall; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSession; /** * Created by zhy on 15/8/17. */ public class OkHttpUtils { public static final String TAG = "OkHttpUtils"; public static final long DEFAULT_MILLISECONDS = 10000; private static OkHttpUtils mInstance; private OkHttpClient mOkHttpClient; private Handler mDelivery; private OkHttpUtils() { OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); //cookie enabled okHttpClientBuilder.cookieJar(new SimpleCookieJar()); mDelivery = new Handler(Looper.getMainLooper()); if (true) { okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); } mOkHttpClient = okHttpClientBuilder.build(); } private boolean debug; private String tag; public OkHttpUtils debug(String tag) { debug = true; this.tag = tag; return this; } public static OkHttpUtils getInstance() { if (mInstance == null) { synchronized (OkHttpUtils.class) { if (mInstance == null) { mInstance = new OkHttpUtils(); } } } return mInstance; } public Handler getDelivery() { return mDelivery; } public OkHttpClient getOkHttpClient() { return mOkHttpClient; } public static GetBuilder get() { return new GetBuilder(); } public static PostStringBuilder postString() { return new PostStringBuilder(); } public static PostFileBuilder postFile() { return new PostFileBuilder(); } public static PostFormBuilder post() { return new PostFormBuilder(); } public void execute(final RequestCall requestCall, Callback callback) { if (debug) { if(TextUtils.isEmpty(tag)) { tag = TAG; } Log.d(tag, "{method:" + requestCall.getRequest().method() + ", detail:" + requestCall.getOkHttpRequest().toString() + "}"); } if (callback == null) callback = Callback.CALLBACK_DEFAULT; final Callback finalCallback = callback; requestCall.getCall().enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, final IOException e) { sendFailResultCallback(call, e, finalCallback); } @Override public void onResponse(final Call call, final Response response) { if (response.code() >= 400 && response.code() <= 599) { try { sendFailResultCallback(call, new RuntimeException(response.body().string()), finalCallback); } catch (IOException e) { e.printStackTrace(); } return; } try { Object o = finalCallback.parseNetworkResponse(response); sendSuccessResultCallback(o, finalCallback); } catch (Exception e) { sendFailResultCallback(call, e, finalCallback); } } }); } public void sendFailResultCallback(final Call call, final Exception e, final Callback callback) { if (callback == null) return; mDelivery.post(new Runnable() { @Override public void run() { callback.onError(call, e); callback.onAfter(); } }); } public void sendSuccessResultCallback(final Object object, final Callback callback) { if (callback == null) return; mDelivery.post(new Runnable() { @Override public void run() { callback.onResponse(object); callback.onAfter(); } }); } public void cancelTag(Object tag) { for (Call call : mOkHttpClient.dispatcher().queuedCalls()) { if (tag.equals(call.request().tag())) { call.cancel(); } } for (Call call : mOkHttpClient.dispatcher().runningCalls()) { if (tag.equals(call.request().tag())) { call.cancel(); } } } public void setCertificates(InputStream... certificates) { mOkHttpClient = getOkHttpClient().newBuilder() .sslSocketFactory(HttpsUtils.getSslSocketFactory(certificates, null, null)) .build(); } public void setConnectTimeout(int timeout, TimeUnit units) { mOkHttpClient = getOkHttpClient().newBuilder() .connectTimeout(timeout, units) .build(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值