HttpClient的简单使用
目录
- HttpClient的使用
- 一、maven坐标
- 二、 主要API
- 2.1 CloseableHttpClient
- 2.2 HttpClients
- 2.3 URIBuilder
- 2.4 HttpGet
- 2.5 HttpPost
- 2.6 HttpEntity
- 2.7 StringEntity
- 2.8 NameValuePair
- 2.9 UrlEncodedFormEntity
- 2.10 InputStreamEntity
- 2.11 CloseableHttpResponse
- 2.12 HttpEntity
- 2.13 EntityUtils
- 三、 案例代码
- 3.1 发送
不带请求参数的get请求 - 3.2 发送
携带请求参数的get请求 - 3.3 发送
不带请求参数以及其他请求体数据的post请求 - 3.4 发送
携带表单格式请求参数的post请求 - 3.5 发送
携带一般字符串请求体数据的post请求 - 3.6 发送
https的get请求
- 3.1 发送
- 四、 一个简单的HttpClientUtil
HttpClient的使用
一、maven坐标
org.apache.httpcomponents httpclient 4.5.2
二、 主要API
2.1 CloseableHttpClient
表示Http客户端对象,用来发送请求并得到响应。线程安全,如果项目中只是偶尔httpclinet,建议每次使用时都新建、关闭此对象。如果项目中频繁使用httpclinet,建议把此对象作为单例使用;
httpClient.execute(request); // 执行get、post等请求
httpClient.close(); // 关闭此客户端对象,释放资源
2.2 HttpClients
用来创建HttpClinet对象的工具类
createDefault(); /创建默认的CloseableHttpClient对象
2.3 URIBuilder
用来构建URI,可以方便的在请求路径后面追加查询字符串
URI uri = new URIBuilder("http://localhost:8080/test")// 设置请求路径.setCharset(Charset.forName("UTF-8"))// 设置编码(默认为项目编码),一般不用设置.addParameter("k1", "v1")// 连续调用此方法可以设置多个请求参数.build();// 构建并返回URI对象 URI表示一个资源路径,可以认为等价于URL
2.4 HttpGet
表示一个get请求对象
HttpGet httpGet = new HttpGet(uri);
httpGet.addHeader("h1", "v1"); 2.5 HttpPost
表示一个post请求对象
HttpPost httpPost = new HttpPost("http://localhost:8080/test/test2");
httpPost.addHeader("h1", "v1"); 2.6 HttpEntity
表示一个请求体
2.7 StringEntity
表示字符串请求体
StringEntity entity = new StringEntity("hello httpclient !", "UTF-8"); 2.8 NameValuePair
表示一对键值对数据
NameValuePair param = new BasicNameValuePair("age", "16"); 2.9 UrlEncodedFormEntity
表示进行URL编码的、符合表单提交格式的字符串请求体
List params = new ArrayList();
params.add(new BasicNameValuePair("name", "蛋蛋"));
params.add(new BasicNameValuePair("age", "16"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
httpPost.setEntity(entity); 2.10 InputStreamEntity
表示字节流形式的请求体
InputStreamEntity entity = new InputStreamEntity(instream); 2.11 CloseableHttpResponse
表示一个响应对象
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
httpResponse.headerIterator();//响应头迭代器
HttpEntity resultEntity = httpResponse.getEntity();//响应体数据 2.12 HttpEntity
表示一个响应体(和请求体是同一个类)
HttpEntity resultEntity = httpResponse.getEntity();
// 使用流的方式操作响应体数据
InputStream inputStream = resultEntity.getContent();
// 如果响应体是字符串数据,可能需要字符编码信息
Header header = resultEntity.getContentEncoding(); 2.13 EntityUtils
可以方便取出响应体数据的工具类,因为此工具类会把所有响应体数据全部缓存到内存中,所以如果响应体数据量较大的话建议直接使用httpEntity.getContent()获取到响应体的读取流,进行流操作;
HttpEntity resultEntity = httpResponse.getEntity();
//此方法会自动根据响应头中的编码信息对响应体内容进行编码,也可以手动指定编码
String result = EntityUtils.toString(resultEntity); 三、 案例代码
注意:
httpclinet可自动管理cookie,所以支持session会话
- 如果发送请求或者接收响应过程中出现的IOException,httpclinet默认会重新发送请求(尝试5次),可能会造成服务器重复处理此请求,如果此请求会修改数据库,就可能造成数据错乱。所以如果某个请求不允许这种情况出现的话,可以禁用重复发送功能;
CloseableHttpClient httpclient = HttpClients.custom()
.setRetryHandler(new StandardHttpRequestRetryHandler(0, false)).build(); 3.1 发送不带请求参数的get请求
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {httpClient = HttpClients.createDefault();HttpGet httpGet = new HttpGet("http://localhost:8080/test");httpResponse httpResponse = httpClient.execute(httpGet);HttpEntity entity = httpResponse.getEntity();String result = EntityUtils.toString(entity);// 处理result的代码...
} finally {if (httpResponse != null) {httpResponse.close();}if (httpClient != null) {httpClient.close();}
} 3.2 发送携带请求参数的get请求
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {httpClient = HttpClients.createDefault();URI uri = new URIBuilder("http://localhost:8080/test")// 设置请求路径.setCharset(Charset.forName("UTF-8"))// 设置编码(默认为项目编码),一般不用设置.addParameter("k1", "v1")// 连续调用此方法可以设置多个请求参数.build();// 构建并返回URI对象HttpGet httpGet = new HttpGet(uri);httpResponse = httpClient.execute(httpGet);HttpEntity entity = httpResponse.getEntity();String result = EntityUtils.toString(entity);// 处理result的代码...
} finally {if (httpResponse != null) {httpResponse.close();}if (httpClient != null) {httpClient.close();}
} 3.3 发送不带请求参数以及其他请求体数据的post请求
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost("http://localhost:8080/test");httpResponse = httpClient.execute(httpPost);HttpEntity entity = httpResponse.getEntity();String result = EntityUtils.toString(entity);// 处理result的代码...
} finally {if (httpResponse != null) {httpResponse.close();}if (httpClient != null) {httpClient.close();}
} 3.4 发送携带表单格式请求参数的post请求
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost("http://localhost:8080/test");List params = new ArrayList();params.add(new BasicNameValuePair("name", "Hali"));params.add(new BasicNameValuePair("age", "16"));UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");httpPost.setEntity(entity);httpResponse = httpClient.execute(httpPost);HttpEntity resultEntity = httpResponse.getEntity();String result = EntityUtils.toString(resultEntity);// 处理result的代码...
} finally {if (httpResponse != null) {httpResponse.close();}if (httpClient != null) {httpClient.close();}
} 3.5 发送携带一般字符串请求体数据的post请求
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost("http://localhost:8080/test");StringEntity entity = new StringEntity("hello httpclient !", "UTF-8");httpPost.setEntity(entity);httpResponse = httpClient.execute(httpPost);HttpEntity resultEntity = httpResponse.getEntity();String result = EntityUtils.toString(resultEntity);// 处理result的代码...
} finally {if (httpResponse != null) {httpResponse.close();}if (httpClient != null) {httpClient.close();}
} 3.6 发送 https的get请求
/*** 创建一个可以访问Https类型URL的工具类,返回一个CloseableHttpClient实例*/
public static CloseableHttpClient createSSLClientDefault(){try {SSLContext sslContext=new SSLContextBuilder().loadTrustMaterial(null,new TrustStrategy() {//信任所有public boolean isTrusted(X509Certificate[] chain, String authType)throws CertificateException {return true;}}).build();SSLConnectionSocketFactory sslsf=new SSLConnectionSocketFactory(sslContext);return HttpClients.custom().setSSLSocketFactory(sslsf).build();} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyStoreException e) {e.printStackTrace();}return HttpClients.createDefault();
}
/*** @throws IOException * @throws ClientProtocolException * */
public static void main(String[] args) throws ClientProtocolException, IOException {//从工具方法中获得对应的可以访问Https的httpClientCloseableHttpClient httpClient =createSSLClientDefault(); HttpGet httpGet=new HttpGet("https://etrade.ccbfund.cn/etrading/tradereq/main.do?method=doInit&isHome=1&menuId=10000");//自己先在浏览器登录一下,自行复制具体的CookiehttpGet.setHeader("Cookie", "HS_ETS_SID=4jSFY2wWwT0gPrWJ45ly!-1286216704; Null=31111111.51237.0000; logtype=2; certtype=0; certNo=33****************; isorgloginpage_cookie=0; hs_etrading_customskin=app_css");//设置代理,方便Fiddle捕获具体信息RequestConfig config=RequestConfig.custom().setProxy(HttpHost.create("127.0.0.1:8888")).build();httpGet.setConfig(config);//执行get请求,获得对应的响应实例CloseableHttpResponse response=httpClient.execute(httpGet);//打印响应的到的html正文HttpEntity entity =response.getEntity();String html=EntityUtils.toString(entity);System.out.println(html);//关闭连接response.close();httpClient.close();
} 四、 一个简单的HttpClientUtil
地址: https://github.com/lunarku/Code_Snippets/blob/master/CodeSnippets/jdk/src/main/java/jdk/util/http/HttpClientUtils.java
转载于:https://www.cnblogs.com/jxkun/p/9399102.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
