代码示例
使用HttpURLConnection实现:
package com.util.httpclient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
/**
* Webapi URL 请求
* @author zhanglang
* 2019-05-23
*/
public class TzWebapiCall {
private static final Logger logger = LoggerFactory.getLogger(TzWebapiCall.class);
//实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
private static TrustManager myX509TrustManager = new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
};
//默认字符集为UTF-8
private String charset = "UTF-8";
//默认POST请求
private String httpMethod = "POST";
//错误信息
private String errorMsg = "";
//请求返回
private String webapiResult = "";
//记录WebAPI请求成功
private boolean isRequestSuccess = true;
//是否需要记录文件日志
private boolean needWriteFileLog = true;
public TzWebapiCall() {
}
public TzWebapiCall(String strHttpMethod) {
this.httpMethod = strHttpMethod;
}
public TzWebapiCall(String strHttpMethod, String strCharset) {
this.httpMethod = strHttpMethod;
this.charset = strCharset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public void setHttpMethod(String httpMethod) {
this.httpMethod = httpMethod;
}
public void setNeedWriteFileLog(boolean needWriteFileLog) {
this.needWriteFileLog = needWriteFileLog;
}
//获取错误信息
public String getErrorMsg() {
return errorMsg;
}
//获取webapi返回结果
public String getWebapiResult() {
return webapiResult;
}
//获取请求结果
public boolean isRequestSuccess() {
return isRequestSuccess;
}
//构建表单数据
private String buildFormData(Map<String, String> keyValues)
throws Exception {
StringBuffer params = new StringBuffer();
if (keyValues != null) {
for (String tmpkey : keyValues.keySet()) {
if (params.length() <= 0) {
params.append(tmpkey).append("=")
.append(URLEncoder.encode(keyValues.get(tmpkey),
"UTF-8"));
} else {
params.append("&").append(tmpkey).append("=")
.append(URLEncoder.encode(keyValues.get(tmpkey),
"UTF-8"));
}
}
}
return params.toString();
}
//获取Webapi的URL 连接对象
private HttpURLConnection openUrl(String apiUrl) {
HttpURLConnection httpConn = null;
try {
//检查是否走https协议
boolean httpsConnection = apiUrl.toLowerCase().startsWith("https://");
//设置SSLContext
SSLContext sslcontext = null;
if (httpsConnection == true) {
sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null,
new TrustManager[] { myX509TrustManager }, null);
}
//打开连接
URL requestUrl = new URL(apiUrl);
HttpsURLConnection httpsConn = null;
if (httpsConnection == true) {
httpsConn = (HttpsURLConnection) requestUrl.openConnection();
} else {
httpConn = (HttpURLConnection) requestUrl.openConnection();
}
//设置套接工厂
if (httpsConnection == true) {
httpsConn.setSSLSocketFactory(sslcontext.getSocketFactory());
httpConn = httpsConn;
}
//设置接受的字符集
httpConn.addRequestProperty("Accept-Charset", charset + ";");
//设置HTTP请求方法
httpConn.setRequestMethod(httpMethod);
//设置header
httpConn.setRequestProperty("Connection", "keep-alive");
httpConn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9,zh-TW;q=0.8");
httpConn.setRequestProperty("Prefer", "return=representation");
return httpConn;
} catch (Exception e) {
e.printStackTrace();
httpConn = null;
}
return httpConn;
}
//从指定HTTP连接对象获取服务器响应内容
private String getResponseContent(HttpURLConnection httpConn)
throws Exception {
String responseText = "";
// 从指定对象httpConn中获取服务器响应内容
try {
// 根据指定的URL地址发起连接请求
httpConn.connect();
// 检查服务器返回的代码
int code = httpConn.getResponseCode();
if (needWriteFileLog) {
logger.info("返回码: " + code);
}
// 检查是否返回500错误
if (HttpsURLConnection.HTTP_INTERNAL_ERROR == code) {
//设置请求失败
isRequestSuccess = false;
// 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(
httpConn.getErrorStream(), Charset.forName("UTF-8")));
String temp = in.readLine();
StringBuilder sb = new StringBuilder();
// 连接成一个字符串
while (temp != null) {
sb.append(temp);
temp = in.readLine();
}
// 关闭流
in.close();
// 取出最终获取的响应内容
responseText = sb.toString();
throw new Exception(
"The server returns an error code: 500, and please check if the parameter format is correct." +
responseText);
}
if ((HttpsURLConnection.HTTP_OK == code) ||
(HttpsURLConnection.HTTP_CREATED == code)) {
// 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(
httpConn.getInputStream(), Charset.forName("UTF-8")));
String temp = in.readLine();
StringBuilder sb = new StringBuilder();
// 连接成一个字符串
while (temp != null) {
sb.append(temp);
temp = in.readLine();
}
// 关闭流
in.close();
// 取出最终获取的响应内容
responseText = sb.toString();
}
if (HttpsURLConnection.HTTP_BAD_REQUEST == code) {
//设置请求失败
isRequestSuccess = false;
// 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(
httpConn.getErrorStream(), Charset.forName("UTF-8")));
String temp = in.readLine();
StringBuilder sb = new StringBuilder();
// 连接成一个字符串
while (temp != null) {
sb.append(temp);
temp = in.readLine();
}
// 关闭流
in.close();
// 取出最终获取的响应内容
responseText = sb.toString();
} else if (HttpsURLConnection.HTTP_NO_CONTENT == code) {
//无返回内容
responseText = "";
}
//其他的请求错误、服务器错误
if (code > 400) {
//设置请求失败
isRequestSuccess = false;
// 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(
httpConn.getErrorStream(), Charset.forName("UTF-8")));
String temp = in.readLine();
StringBuilder sb = new StringBuilder();
// 连接成一个字符串
while (temp != null) {
sb.append(temp);
temp = in.readLine();
}
// 关闭流
in.close();
// 取出最终获取的响应内容
responseText = sb.toString();
}
} catch (Exception e) {
throw e;
}
return responseText;
}
/**
* Description: 请求处理
* @param apiUrl
* @param postData
* @param headerMap
* @param requestIsJsonFormat
* @param responseIsJsonFormat
* @return
*/
private boolean WebapiCallHandler(String apiUrl, String postData,
Map<String, String> headerMap, boolean requestIsJsonFormat,
boolean responseIsJsonFormat) {
boolean callResult = true;
HttpURLConnection httpConn = null;
boolean postRequestFlag = false;
try {
if (needWriteFileLog) {
logger.info("请求URL: " + apiUrl);
logger.info("请求类型: " + httpMethod);
if ((postData != null) && !"".equals(postData)) {
logger.info("post参数: " + postData);
}
}
if (!"".equals(httpMethod)) {
httpConn = openUrl(apiUrl);
if ("POST".equalsIgnoreCase(httpMethod) ||
"PUT".equalsIgnoreCase(httpMethod)) {
postRequestFlag = true;
}
} else {
if ((postData != null) && !"".equals(postData)) {
httpConn = openUrl(apiUrl);
postRequestFlag = true;
} else {
httpConn = openUrl(apiUrl);
}
}
if (httpConn != null) {
//设置请求数据格式及字符集
if (requestIsJsonFormat == true) {
//请求数据格式为JSON格式,字符集为“UTF-8”
httpConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
} else {
//请求数据格式非JSON格式,字符集为“UTF-8”
if (postRequestFlag == true) {
httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
} else {
httpConn.setRequestProperty("Content-Type", "charset=UTF-8");
}
}
//设置客户端接受的响应数据格式及字符集
if (responseIsJsonFormat == true) {
//请求JSON格式的响应数据
httpConn.setRequestProperty("Accept", "application/json");
} else {
//请求非JSON格式的响应数据
httpConn.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
}
// 设置其他请求头信息
if (headerMap != null) {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
String headerName = entry.getKey();
String headerValue = entry.getValue();
httpConn.setRequestProperty(headerName, headerValue);
}
}
//提交数据到HTTP连接对象
if (("".equals(postData) != true) && (postData != null)) {
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
byte[] tmpPostData = postData.getBytes(Charset.forName("UTF-8"));
httpConn.setRequestProperty("Content-Length",
"" + tmpPostData.length);
httpConn.getOutputStream().write(tmpPostData);
httpConn.getOutputStream().flush();
}
//读取服务器响应内容
webapiResult = getResponseContent(httpConn);
if (needWriteFileLog) {
logger.info("返回内容:" + webapiResult);
}
} else {
callResult = false;
errorMsg = "Failed to establish URL connection.";
}
} catch (Exception e) {
callResult = false;
errorMsg = "Request error." + e.getMessage();
logger.error("请求失败,", e);
}
return callResult;
}
/**
* POST请求提交表单数据
* @param url
* @param formData
* @return
*/
public boolean sendPostForm(String url, Map<String, String> formData) {
try {
String strFormData = this.buildFormData(formData);
return this.WebapiCallHandler(url, strFormData, null, false, false);
} catch (Exception e) {
e.printStackTrace();
errorMsg = "The form data is incorrect";
return false;
}
}
/**
* POST请求提交JSON数据
* @param url
* @param jsonData
* @param responseIsJson
* @return
*/
public boolean sendPostJsonData(String url, String jsonData,
boolean responseIsJson) {
return this.WebapiCallHandler(url, jsonData, null, true, responseIsJson);
}
/**
* POST请求提交数据
* @param url
* @param reqData
* @return
*/
public boolean sendPostJsonData(String url, String reqData) {
return this.WebapiCallHandler(url, reqData, null, false, false);
}
/**
*
* POST请求提交数据
* @param url
* @param reqData
* @return
*/
public boolean sendPostJsonData(String url, String reqData,
boolean requestIsJson, boolean responseIsJson) {
return this.WebapiCallHandler(url, reqData, null, requestIsJson,
responseIsJson);
}
/**
* GET请求数据
* @param url
* @return
*/
public boolean sendGet(String url) {
return this.WebapiCallHandler(url, null, null, false, false);
}
/**
* 自定义请求头json格式数据提交
* @param url
* @param postData
* @param headerMap
* @return
*/
public boolean sendRequest(String url, String postData,
Map<String, String> headerMap) {
return this.WebapiCallHandler(url, postData, headerMap, true, true);
}
/**
* 自定义请求头json格式数据提交
* @param url
* @param headerMap
* @return
*/
public boolean sendRequest(String url, Map<String, String> headerMap) {
return this.WebapiCallHandler(url, null, headerMap, false, true);
}
}
用HttpClient实现:
package com.util.httpclient;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 实现Http的Get、Post请求,获取响应内容
* @author zhanglang
* @since 2018-03-15
*/
public class HttpClientService {
private static final Logger logger = LoggerFactory.getLogger(HttpClientService.class);
private final String USER_AGENT = "Mozilla/5.0";
// 请求的地址
private String url;
// 发送请求的类型:GET、POST
private String requestType = "GET";
// 请求参数
private Map<String, Object> paramsMap;
// 请求参数使用的编码,默认UTF-8
private String charset = "UTF-8";
// Get请求拼接的参数
private String getParameters = "?";
// Post请求的参数
private List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
// Header
private Map<String, String> requestHeaders = null;
// 请求响应码
private int responseCode;
//保留换行符
private boolean keepLineBreak = false;
public HttpClientService() {
}
/**
* 构造函数
* @param url 请求地址
* @param requestType 参数传递方式:GET、POST
* @param paramsMap 请求参数名及参数值
* @param charset 对方要求的参数字符编码
*/
public HttpClientService(String url, String requestType,
Map<String, Object> paramsMap, String charset) {
this.url = url;
this.requestType = requestType.toUpperCase();
this.paramsMap = paramsMap;
this.charset = charset;
}
/**
* 构造函数,默认参数传递方式为GET
* @param url 请求地址
* @param paramsMap 请求参数名及参数值
* @param charset 对方要求的参数字符编码
*/
public HttpClientService(String url, Map<String, Object> paramsMap,
String charset) {
this.url = url;
this.paramsMap = paramsMap;
this.charset = charset;
}
/**
* 构造函数,默认传递参数编码为UTF-8
* @param url 请求地址
* @param requestType 参数传递方式:GET、POST
* @param paramsMap 请求参数名及参数值
*/
public HttpClientService(String url, String requestType,
Map<String, Object> paramsMap) {
this.url = url;
this.requestType = requestType.toUpperCase();
this.paramsMap = paramsMap;
}
/**
* 构造函数,默认参数传递方式为GET,默认传递参数编码为UTF-8
* @param url 请求地址
* @param paramsMap 请求参数名及参数值
*/
public HttpClientService(String url, Map<String, Object> paramsMap) {
this.url = url;
this.paramsMap = paramsMap;
}
/**
* 设置请求地址
* @param url
*/
public void setUrl(String url) {
this.url = url;
}
/**
* 设置请求参数传递方式:GET、POST
* @param requestType
*/
public void setRequestType(String requestType) {
this.requestType = requestType.toUpperCase();
}
/**
* 设置请求参数名及参数值
* @param paramsMap
*/
public void setParamsMap(Map<String, Object> paramsMap) {
this.paramsMap = paramsMap;
}
/**
* 设置参数传递使用的编码
* @param charset
*/
public void setCharset(String charset) {
this.charset = charset;
}
/**
* 保留换行符
*/
public void setKeepLineBreak(boolean keepLineBreak) {
this.keepLineBreak = keepLineBreak;
}
/**
* 设置请求头
* @param requestHeaders
*/
public void setRequestHeaders(Map<String, String> requestHeaders) {
this.requestHeaders = requestHeaders;
}
/**
* 获取请求的响应码
* @return
*/
public int getResponseCode() {
return this.responseCode;
}
/**
* 发送请求,并返回响应的内容
* @return
*/
public String sendRequest() {
if ((url == null) || "".equals(url)) {
return "invalid url.";
}
String urlcheck = url.toLowerCase();
if (!urlcheck.startsWith("http://") &&
!urlcheck.startsWith("https://")) {
return "invalid url.";
}
String content = "";
try {
String urlParamSep = "";
// 根据请求类型,拼装参数
Set<String> keySets = paramsMap.keySet();
for (String key : keySets) {
// 将参数值转换为指定编码
String val = new String(String.valueOf(paramsMap.get(key))
.getBytes(charset), charset);
if ("GET".equals(requestType)) {
getParameters = getParameters + urlParamSep + key + "=" +
URLEncoder.encode(val, charset);
if ("".equals(urlParamSep)) {
urlParamSep = "&";
}
} else if ("POST".equals(requestType)) {
postParameters.add(new BasicNameValuePair(key, val));
}
}
if ("GET".equals(requestType)) {
content = this.sendGet();
} else if ("POST".equals(requestType)) {
content = this.sendPost();
}
} catch (Exception e) {
e.printStackTrace();
content = "Request Error.";
}
return content;
}
// HTTP GET request
private String sendGet() throws Exception {
String requestUrl = url;
if (!"?".equals(getParameters)) {
requestUrl = requestUrl + getParameters;
}
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(requestUrl);
// add request header
request.addHeader("User-Agent", USER_AGENT);
if (requestHeaders != null) {
for (Map.Entry<String, String> entry : requestHeaders.entrySet()) {
String headerName = entry.getKey();
String headerValue = entry.getValue();
request.addHeader(headerName, headerValue);
}
}
HttpResponse response = client.execute(request);
responseCode = response.getStatusLine().getStatusCode();
logger.info("\nSending 'GET' request to URL : " + requestUrl);
logger.info("Response Code : " + responseCode);
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));
StringBuffer result = new StringBuffer();
if (keepLineBreak == true) {
int size = 0;
char[] cbuf = new char[512];
while ((size = rd.read(cbuf, 0, cbuf.length)) != -1) {
result.append(new String(cbuf, 0, size));
}
} else {
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
}
String content = result.toString();
logger.info("Response Content : " + content);
return content;
}
// HTTP POST request
private String sendPost() throws Exception {
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
// add header
post.setHeader("User-Agent", USER_AGENT);
if (requestHeaders != null) {
for (Map.Entry<String, String> entry : requestHeaders.entrySet()) {
String headerName = entry.getKey();
String headerValue = entry.getValue();
post.setHeader(headerName, headerValue);
}
}
post.setEntity(new UrlEncodedFormEntity(postParameters));
logger.info("\nSending 'POST' request to URL : " + url);
InputStream in = post.getEntity().getContent();
byte[] b = new byte[512];
StringBuffer params = new StringBuffer();
int size;
while ((size = in.read(b, 0, b.length)) != -1) {
params.append(new String(b, 0, size));
}
logger.info("Post parameters : " + params);
HttpResponse response = client.execute(post);
responseCode = response.getStatusLine().getStatusCode();
logger.info("Response Code : " + responseCode);
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
if (keepLineBreak == true) {
size = 0;
char[] cbuf = new char[512];
while ((size = rd.read(cbuf, 0, cbuf.length)) != -1) {
result.append(new String(cbuf, 0, size));
}
} else {
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
}
String content = result.toString();
logger.info("Response Content : " + content);
return content;
}
}