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
- OkHttp 3.x Best Practice
- Best Practice -- Programming Part
- jdk5 best practice
- jdk5 best practice
- C++ Best Practice
- Hibernate best practice
- JNI best practice
- Best Practice in SQL
- js 递归 best practice
- Linux CRON Best Practice
- SCRUM Best Practice Memo
- Best Practice: SharedPreferences
- HttpClient 4.5 Best Practice
- AsyncHttpClient Best Practice
- TiDB Best Practice
- restful api best practice
- A best practice vs a best system.
- Best Practice for SQL Server
- 配置Java的环境变量
- hadoop源码之Job提交
- 联合使用DatePIcker和TimePicker来选择日期和时间
- Linux文件归档和tar命令的使用
- POJ 2375
- OkHttp 3.x Best Practice
- IKAnalyzer
- Android Studio Emulator 提示 “/dev/kvm is not found” 解决办法
- Android doc |Getting Started|部分 部分译文 --Building Your First App
- 开发人员不可不知的六大JavaScript框架 传统网站网页转移动端方式
- 为什么现在又想开始写技术博客了?
- GitHub 出现 POST git-receive-pack (chunked) 解决方案详解
- nutch源码分析---7
- 【Hibernate】--关联关系映射:一对一关联