基于MVP架构的OKHttp3的封装

一、OKHttp的优势


url测试地址:http://httpbin.org

二、首先对Response进行封装

①定义IResponse接口

public interface IResponse {
    //状态码
    int getCode();
    //数据体
    String getData();
}
②BaseResponse实现继承IResponse

public class BaseResponse implements IResponse {
    public static final int STATE_UNKNOWN_ERROR = 100001;
    public static final int STATE_OK = 200;
    //状态码
    private int code;
    // 响应数据
    private String data;

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getData() {
        return data;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public void setData(String data) {
        this.data = data;
    }
}
三、对Requset进行封装

①定义IRequset接口

public interface IRequest {
    public static final String POST = "POST";
    public static final String GET = "GET";

    /**
     * 指定请求方式
     */
    void setMethod(String method);

    /**
     * 指定请求头部
     */
    void setHeader(String key, String value);

    /**
     * 指定请求参数
     */
    void setBody(String key, String value);

    /**
     * 提供给执行库请求行URL
     *
     * @return
     */
    String getUrl();

    /**
     * 提供给执行库请求头部
     *
     * @return
     */
    Map<String, String> getHeader();

    /**
     * 提供给执行库请求参数
     *
     * @return
     */
    Object getBody();
}
②BaseResquest继承IResquest

public class BaseRequest implements IRequest {
    private String method = POST;
    private String url;
    private Map<String, String> header;
    private Map<String, Object> body;

    BaseRequest(String url) {
        this.url = url;
        header = new HashMap<>();
        body = new HashMap<>();
        header.put("X-Bmob-Application-Id", "");
        header.put("X-Bmob-REST-API-Key", "");
    }

    @Override
    public void setMethod(String method) {
        this.method = method;
    }

    @Override
    public void setHeader(String key, String value) {
        header.put(key, value);
    }

    @Override
    public void setBody(String key, String value) {
        body.put(key, value);
    }

    @Override
    public String getUrl() {
        //http://cloud.bmob.cn/f34e28da5816433d/getMsgCode?phone=${phone}
        if (GET.equals(method)) {
            for (String key : body.keySet()) {
                url = url.replace("${" + key + "}", body.get(key).toString());
            }
        }
        return url;
    }

    @Override
    public Map<String, String> getHeader() {
        return header;
    }

    @Override
    public Object getBody() {
        if (body != null) {
           return new Gson().toJson(body,HashMap.class);
}
        else {
           return "{}";
        }
}
四、最后封装HttpClient

①定义IHttpClient接口

public interface IHttpClient {
    IResponse get(IRequest request, boolean foreCache);

    IResponse post(IRequest request, boolean foreCahe);
}
②OKHttpClientImpl继承IHttpClient

public class OKHttpClientImpl implements IHttpClient {
    OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
            .build();

    @Override
    public IResponse get(IRequest request, boolean foreCache) {
        // 指定请求方式
        request.setMethod(IRequest.GET);
        // 解析头部
        Request.Builder builder = new Request.Builder();
        Map<String, String> header = request.getHeader();
        for (String key : header.keySet()) {
            // 组装成 OkHttp  Header
            builder.header(key, header.get(key));
        }
        //获取url
        String url = request.getUrl();
        builder.url(url).get();
        Request oKRequest = builder.build();
        // 执行 oKRequest
        return execute(oKRequest);
    }


    @Override
    public IResponse post(IRequest request, boolean foreCahe) {
        // 指定请求方式
        request.setMethod(IRequest.POST);
        Request.Builder builder = new Request.Builder();
        MediaType mediaType = MediaType
                .parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(mediaType, request.getBody().toString());
        Map<String, String> header = request.getHeader();
        for(String key:header.keySet()){
            builder.header(key,header.get(key));
        }
        builder.url(request.getUrl()).post(body);
        Request okRequest = builder.build();
        return execute(okRequest);
    }

    private IResponse execute(Request request) {
        BaseResponse commonResponse = new BaseResponse();
        try {
            Response response = mOkHttpClient.newCall(request).execute();
            // 设置状态码
            commonResponse.setCode(response.code());
            String body = response.body().string();
            // 设置响应数据
            commonResponse.setData(body);

        } catch (IOException e) {
            e.printStackTrace();
            commonResponse.setCode(commonResponse.STATE_UNKNOWN_ERROR);
            commonResponse.setData(e.getMessage());
        }
        return commonResponse;
    }
}
五、测试OKHttp的封装

首先选中OKHttpClientImpl右击选择GO TO->Test->勾选setUp/@Before

public class OKHttpClientImplTest {
    private IHttpClient httpClient;

    @Before
    public void setUp() throws Exception {
        httpClient = new OKHttpClientImpl();
    }

    @Test
    public void get() throws Exception {
        String url = "http://httpbin.org/get?uid=${uid}";
        IRequest request = new BaseRequest(url);
        request.setMethod(IRequest.GET);
        request.setBody("uid", "123456");
        request.setHeader("testheader", "dongge");
        IResponse response = httpClient.get(request, false);
        System.out.println("stateCode = " + response.getCode());
        System.out.println("body =" + response.getData());
    }

    @Test
    public void post() throws Exception {
        // 设置 request 参数
        String url = "http://httpbin.org/post";
        IRequest request = new BaseRequest(url);
        request.setMethod(IRequest.POST);
        request.setBody("uid", "123456");
        request.setHeader("testheader", "dongge2");
        IResponse response = httpClient.post(request, false);
        System.out.println("stateCode = " + response.getCode());
        System.out.println("body =" + response.getData());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值