直接上代码,项目时maven项目,需要在pom文件中导入代码中需要引用的jar包;
package com.jokin.learn.HttpTools;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import org.apache.http.*;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
public class HttpUtil {
private Log logger = LogFactory.getLog(this.getClass());
private static final String pattern = "yyyy-MM-dd HH:mm:ss:SSS";
/**
*实现get请求
* @param baseUrl
* @param parameters 传入参数的map;当无参数时,传入的map=null即可
* @param headers 传入header的map, 例如cookies等,当无值时,传入null即可
* @return
*/
public String get1(String baseUrl,Map<String, String> parameters ,Map<String, String> headers ){
//创建一个httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建一个返回值对象
CloseableHttpResponse response = null;
String entityString=null;
try {
URIBuilder uriBuilder = new URIBuilder(baseUrl);
if(parameters!=null&¶meters.size()>0){
for (Map.Entry<String, String> temp : parameters.entrySet() ) {
//循环map里面的每一对键值对,然后获取key和value即时想要的参数的 key和value
uriBuilder.addParameter(temp.getKey(),temp.getValue());
}
}
/*URIBuilder uriBuilder = new URIBuilder("http://www.sogou.com/web");
uriBuilder.addParameter("query", "花千骨");*/
HttpGet get = new HttpGet(uriBuilder.build());//生产一个httpget连接
//添加head, 用setheader 如果已经存在就重置, addheader如果已经存在进行新增同名的header
if(headers!=null&&headers.size()>0){
for (Map.Entry<String, String> temp : headers.entrySet() ) {
//循环map里面的每一对键值对,然后获取key和value即时想要的参数的 key和value
get.setHeader(temp.getKey(),temp.getValue());
}
}
//执行请求
response = httpClient.execute(get);
//取响应的结果
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(statusCode);
HttpEntity entity = response.getEntity();
entityString = EntityUtils.toString(entity, "utf-8");
System.out.println(entityString);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(response !=null){
response.close();
}
if (httpClient!=null){
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return entityString;
}
/**
* 传入的参数为Json格式的的post请求实现方式
* @param baseUrl
* @param parameters
* @return
*/
public String post(String baseUrl,String parameters) {
//CloseableHttpClient 实现了HttpClient, Closeable两个接口
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost postmethod = new HttpPost(baseUrl);
//创建一个uri对象
CloseableHttpResponse response = null;
long startTime = 0L;
long endTime = 0L;
int status = 0;
String bodyString = null;
logger.info("parameters:" + parameters);
if (postmethod != null ) {
try {
// 建立一个NameValuePair数组,用于存储欲传送的参数
postmethod.addHeader("Content-type","application/json; charset=utf-8");
postmethod.setHeader("Accept", "application/json");
if(parameters != null && !"".equals(parameters.trim())){
postmethod.setEntity(new StringEntity(parameters, Charset.forName("UTF-8")));
}
startTime = System.currentTimeMillis();
response = httpClient.execute(postmethod);
endTime = System.currentTimeMillis();
int statusCode = response.getStatusLine().getStatusCode();
logger.info("statusCode:" + statusCode);
logger.info("调用API 花费时间(单位:毫秒):" + (endTime - startTime));
if (statusCode != HttpStatus.SC_OK) {
logger.error("Method failed:" + response.getStatusLine());
status = 1;
}
// Read the response body
bodyString = EntityUtils.toString(response.getEntity());
} catch (IOException e) {
// 网络错误
status = 3;
} finally {
logger.info("调用接口状态:" + status);
try {
if(response !=null){
response.close();
}
if (httpClient!=null){
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bodyString;
}
/**
* get带参调用方式二
* @param url
* @param parametersList
* @return
*/
public String get2(String url ,List<NameValuePair> parametersList) {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
InputStream is = null;
String entityString =null;
String baseUrl =url;
//String baseUrl = "http://localhost:8080/MyWebxTest/getCityByProvinceEname.do";
/*//封装请求参数
List<NameValuePair> params = Lists.newArrayList();
params.add(new BasicNameValuePair("cityEname", "henan"));*/
String str = "";
try {
//转换为键值对
str = EntityUtils.toString(new UrlEncodedFormEntity(parametersList, Consts.UTF_8));
System.out.println(str);
//创建Get请求
HttpGet httpGet = new HttpGet(baseUrl+"?"+str);
//执行Get请求,
response = httpClient.execute(httpGet);
//得到响应体
HttpEntity entity= response.getEntity();
entityString = EntityUtils.toString(entity);
if(entity != null){
is = entity.getContent();
//转换为字节输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is, Consts.UTF_8));
String body = null;
while((body=br.readLine()) != null){
System.out.println(body);
}
}
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//关闭输入流,释放资源
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//消耗实体内容
if(response != null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭相应 丢弃http连接
if(httpClient != null){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return entityString;
}
}