OkHttp 3.x Best Practice

来源:互联网 发布:北大知乎 编辑:程序博客网 时间:2024/06/06 01:13

OkHttp 是square开源的一款优秀HTTP+HTTP/2客户端,它适用于Android和Java平台。

官网介绍原文

An HTTP+HTTP/2 client for Android and Java applications. http://square.github.io/okhttp/

API示例

添加maven依赖,如下:

<dependency>  <groupId>com.squareup.okhttp3</groupId>  <artifactId>okhttp</artifactId>  <version>3.4.1</version></dependency>

1、get请求

OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {  Request request = new Request.Builder()      .url(url)      .build();  Response response = client.newCall(request).execute();  return response.body().string();}

2、post请求

public static final MediaType JSON    = MediaType.parse("application/json; charset=utf-8");OkHttpClient client = new OkHttpClient();String post(String url, String json) throws IOException {  RequestBody body = RequestBody.create(JSON, json);  Request request = new Request.Builder()      .url(url)      .post(body)      .build();  Response response = client.newCall(request).execute();  return response.body().string();}

3、post表单提交

OkHttpClient client = new OkHttpClient();String post(String url, List<FormParam> params) throws IOException {  FormBody.Builder builder = new FormBody.Builder();  for(FormParam param : params){      builder.addEncoded(param.getName(), param.getValue());  }  Request request = new Request.Builder()          .url(url)          .post(builder.build())          .build();  Response response = client.newCall(request).execute();  return response.body().string();}

4、文件上传

import okhttp3.*;import java.io.File;import java.io.IOException;import java.util.concurrent.TimeUnit;/** * ${DESCRIPTION} * * @author Ricky Fung * @create 2016-11-17 15:16 */public class FileUploadTest {    OkHttpClient client = new OkHttpClient.Builder()            .connectTimeout(5, TimeUnit.SECONDS)            .readTimeout(5, TimeUnit.SECONDS)            .build();    public void upload(String url, File file) throws IOException {        RequestBody formBody = new MultipartBody.Builder()                .setType(MultipartBody.FORM)                .addFormDataPart("file", file.getName(),                        RequestBody.create(MediaType.parse("text/plain"), file))                .addFormDataPart("field1", "field1_value")                .build();        Request request = new Request.Builder()                .url(url)                .post(formBody)                .build();        Response response = this.client.newCall(request).execute();    }}

最佳实践

OkHttp官方doc建议只创建一个OkHttpClient 示例对象来处理所有的http请求。
官网原文:

OkHttpClients should be shared

OkHttp performs best when you create a single OkHttpClient instance and reuse it for all of your HTTP calls. This is because each client holds its own connection pool and thread pools. Reusing connections and threads reduces latency and saves memory. Conversely, creating a client for each request wastes resources on idle pools.

OkHttpClient构造

1、create a shared instance with the default settings:

// The singleton HTTP client.public final OkHttpClient client = new OkHttpClient();

2、create a shared instance with custom settings:

// The singleton HTTP client.public final OkHttpClient client = new OkHttpClient.Builder()       .readTimeout(6000,TimeUnit.MILLISECONDS)       .connectTimeout(6000, TimeUnit.MILLISECONDS)       .addInterceptor(new HttpLoggingInterceptor())       .cache(new Cache(cacheDir, cacheSize))       .build();


OkHttp封装类

平时开发中经常需要跟http请求打交道,于是乎自己对Apache HttpClient、OkHttp、AsyncHttpClient 统一做了封装,这里只展示对OkHttp的封装,代码如下:

OkHttpClientImpl类

package com.bytebeats.toolkit.http.impl;import com.bytebeats.toolkit.annotation.ThreadSafe;import com.bytebeats.toolkit.http.HttpRequestException;import com.bytebeats.toolkit.http.config.FormParam;import com.bytebeats.toolkit.http.config.HttpRequestConfig;import okhttp3.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.util.List;import java.util.concurrent.TimeUnit;/** * OkHttp实现 * https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html * * @author Ricky Fung * @create 2016-08-23 12:17 */@ThreadSafepublic class OkHttpClientImpl extends HttpClient {    public static final MediaType JSON            = MediaType.parse("application/json; charset=utf-8");    private final Logger logger = LoggerFactory.getLogger(OkHttpClientImpl.class);    private OkHttpClient client;    public OkHttpClientImpl(HttpRequestConfig config) {        super(config);        ConnectionPool connectionPool = new ConnectionPool(5, 5, TimeUnit.SECONDS);        client = new OkHttpClient.Builder()                .readTimeout(this.config.getReadTimeout(), TimeUnit.MILLISECONDS)                .connectTimeout(this.config.getConnectTimeout(), TimeUnit.MILLISECONDS)                .connectionPool(connectionPool)                .retryOnConnectionFailure(false)                .build();    }    @Override    public String get(String url) throws HttpRequestException {        Request request = createGetRequest(url);        Response response = execute(request);        try {            return convertResponseBodyToString(response.body());        }catch (IOException e) {            logger.error("OkHttp getAsBytes error", e);            throw new HttpRequestException("OkHttp getAsBytes error", e);        }    }    @Override    public byte[] getBytes(String url) throws HttpRequestException {        Request request = createGetRequest(url);        Response response = execute(request);        try {            return convertResponseBodyToBytes(response.body());        } catch (IOException e) {            logger.error("OkHttp getAsBytes error", e);            throw new HttpRequestException("OkHttp getAsBytes error", e);        }    }    @Override    public String postWithForm(String url, List<FormParam> params) throws HttpRequestException {        Request request = createPostForm(url, params);        Response response = execute(request);        try {            return convertResponseBodyToString(response.body());        }catch (IOException e) {            logger.error("OkHttp postWithForm error", e);            throw new HttpRequestException("OkHttp postWithForm error", e);        }    }    @Override    public byte[] postWithFormBytes(String url, List<FormParam> params) throws HttpRequestException {        Request request = createPostForm(url, params);        Response response = execute(request);        try {            return convertResponseBodyToBytes(response.body());        }catch (IOException e) {            logger.error("OkHttp postWithForm error", e);            throw new HttpRequestException("OkHttp postWithForm error", e);        }    }    @Override    public String postWithBody(String url, String json) throws HttpRequestException {        Request request = createPostBody(url, json);        Response response = execute(request);        try {            return convertResponseBodyToString(response.body());        }catch (IOException e) {            logger.error("OkHttp getAsBytes error", e);            throw new HttpRequestException("OkHttp getAsBytes error", e);        }    }    @Override    public byte[] postWithBodyBytes(String url, String json) throws HttpRequestException {        Request request = createPostBody(url, json);        Response response = execute(request);        try {            return convertResponseBodyToBytes(response.body());        } catch (IOException e) {            logger.error("OkHttp postAsBytes error", e);            throw new HttpRequestException("OkHttp postAsBytes error", e);        }    }    private Response execute(Request request) throws HttpRequestException {        try{            return client.newCall(request).execute();        }catch (Exception e){            logger.error("OkHttp post error", e);            throw new HttpRequestException("OkHttp post error", e);        }    }    private String convertResponseBodyToString(ResponseBody responseBody) throws IOException {        if(responseBody!=null){            return responseBody.string();        }        return null;    }    private byte[] convertResponseBodyToBytes(ResponseBody responseBody) throws IOException {        if(responseBody!=null){            return responseBody.bytes();        }        return null;    }    private Request createPostForm(String url, List<FormParam> params){        FormBody.Builder builder = new FormBody.Builder();        for(FormParam param : params){            builder.addEncoded(param.getName(), param.getValue());        }        Request request = new Request.Builder()                .url(url)                .post(builder.build())                .build();        return request;    }    private Request createPostBody(String url, String json){        RequestBody body = RequestBody.create(JSON, json);        Request request = new Request.Builder()                .url(url)                .post(body)                .build();        return request;    }    private Request createGetRequest(String url){        Request request = new Request.Builder()                .url(url)                .build();        return request;    }}

FormParam 类

package com.bytebeats.toolkit.http.config;/** * ${DESCRIPTION} * * @author Ricky Fung * @create 2016-08-24 16:17 */public class FormParam {    private final String name;    private final String value;    public FormParam(String name, String value) {        this.name = name;        this.value = value;    }    public String getName() {        return this.name;    }    public String getValue() {        return this.value;    }}



参考资料

OkHttp官网:http://square.github.io/okhttp/
OkHttp Recipes:https://github.com/square/okhttp/wiki/Recipes
OkHttpClient doc:https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html

0 0