使用Httpclient发送get,post等请求方式代码记录:
**友情提醒:**本文为个人工作实战记录,而非面面俱到的普及性文章,如有不适,还望谅解。
注意事项:
- 本文使用4.3版本以后的HttpClient,读者现在还会看到网上仍然有人发布HttpClient旧版本的使用文章,建议直接使用新版本。
首先先来一个简单的示例,该示例中的方式可能在实际项目中不会采用,但是却方便我们理解httpclient的使用方式:
public static String doGet() {
String result = "";
InputStream inputStream = null;
BufferedReader bufferedReader = null;
CloseableHttpClient client = HttpClients.createDefault();
try {
URI uri = new URIBuilder()
.setScheme("https")
.setHost("www.baidu.com")
.setParameter("app-key", "123456")
.build();
HttpGet httpGet = new HttpGet(uri);
CloseableHttpResponse response = null;
response = client.execute(httpGet);
URI testUri = httpGet.getURI();
System.out.println("params test " + testUri);
System.out.println(response.getStatusLine().getStatusCode());
Header[] headers = response.getAllHeaders();
System.out.println("response header " + headers.length);
for(Header temp : headers){
System.out.println("response header " + temp.toString());
}
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// 包装输入流
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuffer sbf = new StringBuffer();
// 读取封装的输入流
String temp = null;
while ((temp = bufferedReader.readLine()) != null) {
sbf.append(temp).append("\r\n");
}
result = sbf.toString();
return result;
} catch (URISyntaxException | IOException e) {
e.printStackTrace();
} finally{
// 关闭资源
if (null != bufferedReader) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != response) {
response.close();
}
}
return null;
}
接下来我们开始讲解如何在实际项目中写出支持高并发的httpclient使用代码,下面的代码是真正的开发代码,对整个代码结构都进行了个人编码风格上的封装:
- 1.首先初始化连接池:
private static void init() {
if (cm == null) {
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(50);// 整个连接池最大连接数
cm.setDefaultMaxPerRoute(5);// 每路由最大连接数,默认值是2
}
}
- 2.编写获取连接的方法:
private static CloseableHttpClient getHttpClient() {
init();
return HttpClients.custom().setConnectionManager(cm).build();
}
3.编写get,post请求方法:入参有url,请求头,参数集合,当然这个可以由你们自己控制代码结构。
public static String httpGetRequest(String url, Map<String, Object> headers, Map<String, Object> params) throws URISyntaxException{
URIBuilder ub = assembleURL(url);
if(null != params && !params.isEmpty()) {
ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
ub.setParameters(pairs);
}
HttpGet httpGet = new HttpGet(ub.build());
System.out.println("httpGet " +ub.build().toString());
if(null != headers && !headers.isEmpty()) {
for (Map.Entry<String, Object> param : headers.entrySet()) {
httpGet.addHeader(param.getKey(), String.valueOf(param.getValue()));
}
}
return getResult(httpGet);
}
public static String httpPostRequest(String url, Map<String, Object> headers, Map<String, Object> params) throws URISyntaxException, UnsupportedOperationException, IOException {
URIBuilder ub = assembleURL(url);
HttpPost httpPost = new HttpPost(ub.build());
if(null != headers && !headers.isEmpty()) {
for (Map.Entry<String, Object> param : headers.entrySet()) {
httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
}
}
if(null != params && !params.isEmpty()) {
ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8));
}
System.out.println("httpPost url " + httpPost.getURI());
return getResult(httpPost);
}
/**
*封装url方法
*/
private static URIBuilder assembleURL(String url) {
URIBuilder ub = new URIBuilder();
ub.setScheme("http");
ub.setHost("172.19.250.89");
ub.setPort("8989");
ub.setPath(url);
return ub;
}
4.发送http 请求并处理返回结果:
public static String getResult(HttpRequestBase request) {
String result = "";
InputStream inputStream = null;
BufferedReader bufferedReader = null;
CloseableHttpClient httpClient = getHttpClient();
CloseableHttpResponse response = null;
try{
response = httpClient.execute(request);
System.out.println("--request result status--" + response.getStatusLine().toString());
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// 包装输入流
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuffer sbf = new StringBuffer();
// 读取封装的输入流
String temp = null;
while ((temp = bufferedReader.readLine()) != null) {
sbf.append(temp).append("\r\n");
}
result = sbf.toString();
return result;
} catch (Exception e) {
logger.error("httpclient request occur error",e);
} finally {
// 关闭资源
if (null != bufferedReader) {
try {
bufferedReader.close();
} catch (IOException e) {
logger.error("IOException",e);;
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
logger.error("IOException",e);;
}
}
if(null != response) {
try {
response.close();
httpClient.close();
} catch (IOException e) {
logger.error("IOException",e);;
}
}
}
return EMPTY_STR;
}
}