简介
HTTP 协议是 Internet 上使用得最多、最重要的协议之一,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
使用httpClient
导入依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>
编写httpClient工具类
public class HttpUtil {
/**
* 发送post请求
* @param inurl
* @param params
* @return
* @throws IOException
*/
public static String readByPost(String inurl,String params) throws IOException {
StringBuffer sbf = new StringBuffer();
String strRead = null;
URL url = new URL(inurl);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.connect();
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.print(params);
out.flush();
InputStream is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
while((strRead = reader.readLine())!=null){
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
connection.disconnect();
return sbf.toString();
}
/**
* 向指定 URL 发送POST方法的请求
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送POST请求出现异常:" + e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
public String sendPost(String url, Map<String, String> params) {
try {
String body = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost postMethod = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
}
HttpEntity entity = new UrlEncodedFormEntity(nvps, "UTF-8");
postMethod.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(postMethod);
HttpEntity httpEntity = response.getEntity();
if (entity != null) {
body = EntityUtils.toString(httpEntity, "UTF-8");
}
return body;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String sendGet(String url, Map<String, Object> params) {
try {
String body = null;
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
if (params != null && params.size() > 0) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
nvps.add(new BasicNameValuePair(entry.getKey(), (String) entry.getValue()));
}
}
URIBuilder uriBuilder = new URIBuilder(url);
uriBuilder.setParameters(nvps);
HttpGet getMethod = new HttpGet(uriBuilder.build());
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(getMethod);
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
body = EntityUtils.toString(httpEntity, "UTF-8");
}
return body;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/*入参说明
*
* param url 请求地址
* param jsonObject 请求的json数据
* param encoding 编码格式
*
* */
public String jsonPost(String url, String json) {
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
String result = null;
try {
StringEntity s = new StringEntity(json);
s.setContentEncoding("UTF-8");
s.setContentType("application/json");//发送json数据需要设置contentType
post.setEntity(s);
HttpResponse res = httpclient.execute(post);
result = EntityUtils.toString(res.getEntity(), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求(为了解决坑爹的erp登录接口问题,用这个)
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public String jsonPost(String url, String param,String contentType) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("Content-Type", contentType);
conn.setRequestProperty("Accept-Charset", "UTF-8");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送POST请求出现异常:" + e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
将Map集合转换成JSON格式的字符串
//转换成JSON格式的字符串
public String toJsonString(Map map){
JSONObject json = new JSONObject(map);
String params = json.toString();
System.out.println("输入参数json格式:"+params);
return params;
}