HttpClient,okhttp,Jodd-http 使用上的差异
Posted jiezai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpClient,okhttp,Jodd-http 使用上的差异相关的知识,希望对你有一定的参考价值。
http作为最常用的网络请求方式,用来交换数据,不同的http客户端,性能使用方式都有所差别,本文将对HttpClient,okhttp,Jodd-http三者的put,post请求方式做一个对比。
1 <dependency> 2 <groupId>org.jodd</groupId> 3 <artifactId>jodd-http</artifactId> 4 <version>5.1.4</version> 5 </dependency> 6 7 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> 8 <dependency> 9 <groupId>com.squareup.okhttp3</groupId> 10 <artifactId>okhttp</artifactId> 11 <version>4.4.0</version> 12 </dependency> 13 14 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> 15 <dependency> 16 <groupId>org.apache.httpcomponents</groupId> 17 <artifactId>httpclient</artifactId> 18 <version>4.5.12</version> 19 </dependency> 20 21 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> 22 <dependency> 23 <groupId>com.alibaba</groupId> 24 <artifactId>fastjson</artifactId> 25 <version>1.2.62</version> 26 </dependency> 27
Apache HttpClient
发送请求主要分为以下几步:
- 创建 CloseableHttpClient对象/CloseableHttpAsyncClient对象,前者同步,后者异步
- 创建具体的Http请求对象,例如HttpGet,HttpPost
- 调用execute方法执行请求,如果是异步请求在执行之前需调用start方法
get请求
@Test public void testApacheHttpGet(String url) throws IOException { //设置超时时间 RequestConfig config = RequestConfig.custom() .setConnectTimeout(60 * 1000) //连接超时时间 .setSocketTimeout(60 * 1000) //从服务器获取响应数据的超时时间 .build(); CloseableHttpClient client = HttpClientBuilder.create().build(); HttpGet httpGet = new HttpGet(url); httpGet.setConfig(config); CloseableHttpResponse response = client.execute(httpGet); System.out.println(EntityUtils.toString(response.getEntity())); }
post请求:
@Test public void testApacheHttpPost(String url) throws IOException { CloseableHttpClient client = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json;charset=utf8"); httpPost.setEntity(new StringEntity(new JSONObject().toString())); //设置请求体 CloseableHttpResponse response = client.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity())); }
okhttp
发送请求主要分为以下几步:
- 创建OkHttpClient对象
- 创建Request对象
- 将Request 对象封装为Call
- 通过Call 来执行同步或异步请求,调用execute方法同步执行,调用enqueue方法异步执行
get请求:
@Test
public void testOkHttpGet(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
System.out.println(response.body().toString());
}
post请求:
@Test
public void testOkHttpPost(String url) throws IOException {
JSONObject json = new JSONObject();
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),String.valueOf(json));
Request build = new Request.Builder()
.url(url)
.post(body)
.header("Content-Type","application/json;charset=utf8")
.build();
Call call = okHttpClient.newCall(build);
Response response = call.execute();
String string = response.body().string();
}
设置超时
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(60, TimeUnit.SECONDS)//设置读取超时时间
.build();
对client设置超时,意味着所有请求方式都将采取此种超时设置。
Jodd-http
Jodd提供的一个轻量级、原生的的http客户端,使用起来很简单、方便。
get请求:
请求参数可以直接拼接在url后面,也可以通过query()方法指定
@Test public void testJoddHttpGet(String url) throws IOException { HttpResponse response = HttpRequest .get(url) //指定请求方式 .contentType("application/json") //指定编码方式 .query("xxx", "xxx") .connectionKeepAlive(true)//长连接 .timeout(60 * 1000) //超时设置 .send(); //发送请求 System.out.println(response.bodyText()); }
response存储服务器返回的数据。可以从response实例中提取出各种属性,如statusCode()
或者statusPhrase()。
response读取响应body有三种方法:
response.bodyText() body文本,以头信息指定的方式编码
response.bodyBytes() body字节
response.body() 以ISO-8859-1 encoding
post请求:
请求体存放在bodyText中。也可以通过form("xx","xx")表单加参数
public void testJoddHttpPost(String url) throws IOException { HttpResponse response = HttpRequest .post(url) .contentType("application/json") .bodyText("xxx") .send(); System.out.println(response.bodyText()); }
小结:
- 代码量方面来看 jodd-http < okhttp <apache-http。
- 超时设置上,jodd-http和apache-httpclient更为灵活,okhttp对client 进行设置,无法对单个请求设置。
以上是关于HttpClient,okhttp,Jodd-http 使用上的差异的主要内容,如果未能解决你的问题,请参考以下文章
为啥我应该使用 OkHttp 而不是 android httpClient 和 AsyncTask
HTTP连接客户端,选 HttpClient 还是 OkHttp ?