|
|
|
@ -0,0 +1,205 @@
|
|
|
|
|
package com.sky.utils;
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import org.apache.http.NameValuePair;
|
|
|
|
|
import org.apache.http.client.config.RequestConfig;
|
|
|
|
|
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.message.BasicNameValuePair;
|
|
|
|
|
import org.apache.http.util.EntityUtils;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.net.URI;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* HttpClientUtil类,是一个Http工具类,主要用于在Java程序中方便地发送HTTP请求(支持GET、POST等常见方式),并获取相应的响应结果,
|
|
|
|
|
* 简化了与HTTP协议交互的操作,使得在项目中进行网络请求相关的业务逻辑开发更加便捷高效,避免了重复编写复杂的底层HTTP请求代码。
|
|
|
|
|
*/
|
|
|
|
|
public class HttpClientUtil {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 定义请求超时时间,单位为毫秒,此处设置为5秒(5 * 1000毫秒),用于控制HTTP请求在连接建立、等待连接可用以及数据传输等阶段的最长等待时间,
|
|
|
|
|
* 避免因网络问题等原因导致请求长时间阻塞,影响程序的性能和稳定性,在创建请求配置时会应用这个超时时间。
|
|
|
|
|
*/
|
|
|
|
|
static final int TIMEOUT_MSEC = 5 * 1000;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送GET方式请求的方法,用于向指定的URL发送GET请求,并可携带请求参数,最后返回服务器响应的结果字符串。
|
|
|
|
|
*
|
|
|
|
|
* @param url 请求的url,即要访问的目标服务器资源的网络地址,完整地指定了请求的目标位置,例如某个API接口地址等。
|
|
|
|
|
* @param paramMap 请求参数,以Map形式存储,其中键为参数名,值为对应的参数值,可用于向服务器传递一些查询条件、筛选条件等信息,方便服务器根据这些参数返回相应的数据,参数可为空,表示无参数请求。
|
|
|
|
|
* @return 返回响应结果,是服务器接收到请求后返回的内容,通常为JSON字符串、HTML页面内容或者其他符合约定的数据格式,若请求出现异常等情况可能返回空字符串。
|
|
|
|
|
*/
|
|
|
|
|
public static String doGet(String url, Map<String, String> paramMap) {
|
|
|
|
|
// 创建Httpclient对象,通过HttpClients.createDefault()方法获取默认配置的可关闭的HttpClient实例,用于后续发起HTTP请求,它是整个请求操作的基础客户端对象。
|
|
|
|
|
CloseableHttpClient httpClient = HttpClients.createDefault();
|
|
|
|
|
|
|
|
|
|
String result = "";
|
|
|
|
|
CloseableHttpResponse response = null;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 创建URIBuilder对象,用于构建完整的URI(统一资源标识符),可以方便地在给定基础URL的基础上添加各种参数,构造出符合要求的请求地址。
|
|
|
|
|
URIBuilder builder = new URIBuilder(url);
|
|
|
|
|
if (paramMap!= null) {
|
|
|
|
|
// 遍历请求参数Map,将每个参数添加到URIBuilder中,使其构建的URI包含相应的查询参数,按照参数名和参数值的对应关系进行添加,形成完整的带参请求地址。
|
|
|
|
|
for (String key : paramMap.keySet()) {
|
|
|
|
|
builder.addParameter(key, paramMap.get(key));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 根据构建好的URIBuilder生成最终的URI对象,该对象完整地描述了请求的目标资源位置及相关参数信息。
|
|
|
|
|
URI uri = builder.build();
|
|
|
|
|
|
|
|
|
|
// 创建GET请求对象,使用生成的URI来初始化HttpGet实例,明确此次请求的方式为GET以及请求的具体目标地址。
|
|
|
|
|
HttpGet httpGet = new HttpGet(uri);
|
|
|
|
|
|
|
|
|
|
// 发送请求,通过之前创建的HttpClient实例执行HttpGet请求,获取服务器返回的响应对象CloseableHttpResponse,此对象包含了响应的状态码、响应头以及响应体等重要信息。
|
|
|
|
|
response = httpClient.execute(httpGet);
|
|
|
|
|
|
|
|
|
|
// 判断响应状态,获取响应的状态码,若状态码为200,表示请求成功,此时将响应体内容(通过EntityUtils.toString方法,指定编码为"UTF-8")读取出来赋值给result变量,作为最终的响应结果返回;若状态码不是200,则返回空字符串。
|
|
|
|
|
if (response.getStatusLine().getStatusCode() == 200) {
|
|
|
|
|
result = EntityUtils.toString(response.getEntity(), "UTF-8");
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
try {
|
|
|
|
|
// 关闭响应对象,释放相关资源,避免资源泄漏,无论请求是否成功都需要执行此操作。
|
|
|
|
|
response.close();
|
|
|
|
|
// 关闭HttpClient对象,释放其占用的网络连接等资源,确保程序的资源管理良好。
|
|
|
|
|
httpClient.close();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送POST方式请求的方法(用于发送表单形式数据的POST请求),向指定URL发送POST请求,携带以表单形式组织的参数,返回服务器响应的结果字符串,若请求过程中出现IO异常则向上抛出。
|
|
|
|
|
*
|
|
|
|
|
* @param url 目标请求的URL地址,指定了请求要发送到的服务器资源位置,同GET请求方法中的url参数作用类似。
|
|
|
|
|
* @param paramMap 请求参数,以Map形式存储,其中键是表单字段名,值为对应字段的值,用于向服务器传递需要处理的数据,比如提交用户注册信息、登录信息等以表单形式组织的数据,参数可为空表示无参数POST请求。
|
|
|
|
|
* @return 返回响应结果,即服务器接收到POST请求后返回的内容,格式根据服务器端的响应设定而定,通常可能是操作结果提示信息、新生成的数据等内容,以字符串形式返回,若请求出现异常等情况则按照异常处理逻辑进行处理。
|
|
|
|
|
* @throws IOException 当在请求执行过程中(如创建请求实体、执行请求、关闭响应等操作涉及到的输入输出操作)出现I/O相关异常时,会将该异常向上抛出,由调用者进行进一步的处理。
|
|
|
|
|
*/
|
|
|
|
|
public static String doPost(String url, Map<String, String> paramMap) throws IOException {
|
|
|
|
|
// 创建Httpclient对象,获取默认配置的可关闭的HttpClient实例,用于后续发起HTTP的POST请求操作,作为请求的客户端基础对象。
|
|
|
|
|
CloseableHttpClient httpClient = HttpClients.createDefault();
|
|
|
|
|
CloseableHttpResponse response = null;
|
|
|
|
|
String resultString = "";
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 创建Http Post请求对象,使用给定的URL初始化HttpPost实例,明确此次请求的方式为POST以及请求的目标地址,后续将在此基础上添加请求参数等内容。
|
|
|
|
|
HttpPost httpPost = new HttpPost(url);
|
|
|
|
|
|
|
|
|
|
// 创建参数列表,若传入的请求参数Map不为空,则遍历该Map,将每个参数转换为NameValuePair对象并添加到List中,NameValuePair用于表示键值对形式的参数,方便后续构建表单形式的请求实体。
|
|
|
|
|
if (paramMap!= null) {
|
|
|
|
|
List<NameValuePair> paramList = new ArrayList<>();
|
|
|
|
|
for (Map.Entry<String, String> param : paramMap.entrySet()) {
|
|
|
|
|
paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
|
|
|
|
|
}
|
|
|
|
|
// 模拟表单,通过将参数列表转换为UrlEncodedFormEntity对象来构建表单形式的请求实体,它会对参数进行适当的编码处理(例如对中文等特殊字符进行URL编码),符合HTTP表单提交的规范,然后将该请求实体设置到HttpPost请求对象中,使得请求携带相应的参数信息。
|
|
|
|
|
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
|
|
|
|
|
httpPost.setEntity(entity);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置请求配置,通过调用builderRequestConfig方法构建请求配置对象,并设置到HttpPost请求中,该配置包含了连接超时时间、请求获取连接的超时时间以及套接字超时时间等设置,确保请求在合理的时间范围内进行,避免长时间等待。
|
|
|
|
|
httpPost.setConfig(builderRequestConfig());
|
|
|
|
|
|
|
|
|
|
// 执行http请求,使用HttpClient实例执行HttpPost请求,获取服务器返回的响应对象CloseableHttpResponse,其中包含了响应的各种关键信息,如状态码、响应头和响应体等。
|
|
|
|
|
response = httpClient.execute(httpPost);
|
|
|
|
|
// 将响应体内容(通过EntityUtils.toString方法,指定编码为"UTF-8")读取出来赋值给resultString变量,作为最终的响应结果返回,若响应体为空或者读取出现异常等情况会按照相应逻辑处理。
|
|
|
|
|
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw e;
|
|
|
|
|
} finally {
|
|
|
|
|
try {
|
|
|
|
|
// 关闭响应对象,释放相关资源,确保资源正确回收,避免资源泄漏,无论请求是否成功都需要执行此操作。
|
|
|
|
|
response.close();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return resultString;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送POST方式请求的方法(用于发送JSON格式数据的POST请求),向指定URL发送POST请求,携带以JSON格式组织的参数,返回服务器响应的结果字符串,若请求过程中出现IO异常则向上抛出。
|
|
|
|
|
*
|
|
|
|
|
* @param url 目标请求的URL地址,指定了请求要发送到的服务器资源位置,作用与前面的POST方法中的url参数相同。
|
|
|
|
|
* @param paramMap 请求参数,以Map形式存储,用于构建JSON格式的数据,其中键将作为JSON对象中的属性名,值作为对应的属性值,方便向服务器传递复杂的数据结构,参数可为空表示无参数的JSON格式POST请求。
|
|
|
|
|
* @return 返回响应结果,即服务器接收到JSON格式POST请求后返回的内容,格式根据服务器端的响应设定而定,一般可能是处理后的JSON数据、操作提示信息等,以字符串形式返回,若请求出现异常等情况则按照相应的异常处理逻辑进行处理。
|
|
|
|
|
* @throws IOException 当在请求执行过程中(如构造JSON数据、创建请求实体、执行请求、关闭响应等操作涉及到的输入输出操作)出现I/O相关异常时,会将该异常向上抛出,由调用者进行进一步的处理。
|
|
|
|
|
*/
|
|
|
|
|
public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
|
|
|
|
|
// 创建Httpclient对象,获取默认配置的可关闭的HttpClient实例,作为发起HTTP的JSON格式POST请求的客户端基础对象。
|
|
|
|
|
CloseableHttpClient httpClient = HttpClients.createDefault();
|
|
|
|
|
CloseableHttpResponse response = null;
|
|
|
|
|
String resultString = "";
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 创建Http Post请求对象,使用给定的URL初始化HttpPost实例,明确此次请求的方式为POST以及请求的目标地址,后续在此基础上构建JSON格式的请求数据。
|
|
|
|
|
HttpPost httpPost = new HttpPost(url);
|
|
|
|
|
|
|
|
|
|
if (paramMap!= null) {
|
|
|
|
|
// 构造json格式数据,通过遍历请求参数Map,将每个参数添加到JSONObject中,形成一个JSON格式的对象,其中参数名作为JSON对象的属性名,参数值作为对应属性的值,方便以JSON格式向服务器传递数据,符合现在很多基于RESTful API等交互中常用的JSON数据传输规范。
|
|
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
|
|
for (Map.Entry<String, String> param : paramMap.entrySet()) {
|
|
|
|
|
jsonObject.put(param.getKey(), param.getValue());
|
|
|
|
|
}
|
|
|
|
|
// 创建StringEntity对象,将JSON对象转换为字符串形式,并指定编码为"utf-8",然后设置其内容编码和数据类型(设置为"application/json",表明这是一个JSON格式的数据),最后将该请求实体设置到HttpPost请求对象中,使得请求携带JSON格式的参数信息。
|
|
|
|
|
StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8");
|
|
|
|
|
// 设置请求编码,明确请求实体的编码方式为"utf-8",确保数据在传输过程中的编码一致性,便于服务器正确解析接收到的数据。
|
|
|
|
|
entity.setContentEncoding("utf-8");
|
|
|
|
|
// 设置数据类型,将请求实体的数据类型设置为"application/json",告知服务器此次请求发送的数据是JSON格式的,方便服务器按照相应的解析方式处理接收到的数据。
|
|
|
|
|
entity.setContentType("application/json");
|
|
|
|
|
httpPost.setEntity(entity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置请求配置,调用builderRequestConfig方法构建请求配置对象,并设置到HttpPost请求中,该配置包含了连接超时时间、请求获取连接的超时时间以及套接字超时时间等设置,保证请求能在合理的时间范围内完成,避免因网络等问题导致请求长时间无响应。
|
|
|
|
|
httpPost.setConfig(builderRequestConfig());
|
|
|
|
|
|
|
|
|
|
// 执行http请求,使用HttpClient实例执行HttpPost请求,获取服务器返回的响应对象CloseableHttpResponse,该对象包含了响应的状态码、响应头以及响应体等重要信息,用于后续获取响应结果。
|
|
|
|
|
response = httpClient.execute(httpPost);
|
|
|
|
|
|
|
|
|
|
// 将响应体内容(通过EntityUtils.toString方法,指定编码为"UTF-8")读取出来赋值给resultString变量,作为最终的响应结果返回,若响应体为空或者读取出现异常等情况会按照相应逻辑处理。
|
|
|
|
|
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw e;
|
|
|
|
|
} finally {
|
|
|
|
|
try {
|
|
|
|
|
// 关闭响应对象,释放相关资源,避免资源泄漏,无论请求是否成功都需要执行此操作。
|
|
|
|
|
response.close();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return resultString;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构建请求配置的私有方法,用于创建一个RequestConfig对象,设置了连接超时时间、请求获取连接的超时时间以及套接字超时时间,均使用类中定义的TIMEOUT_MSEC常量值(5秒),
|
|
|
|
|
* 该配置对象用于在发送HTTP请求(如HttpGet、HttpPost等请求)时设置相关的超时限制,确保请求在合理的时间范围内进行,避免因网络问题等导致请求长时间阻塞,影响程序性能和用户体验。
|
|
|
|
|
*
|
|
|
|
|
* @return 返回构建好的RequestConfig对象,包含了设置好的各种超时时间配置,供其他发送请求的方法使用来设置请求的超时相关属性。
|
|
|
|
|
*/
|
|
|
|
|
private static RequestConfig builderRequestConfig() {
|
|
|
|
|
return RequestConfig.custom()
|
|
|
|
|
.setConnectTimeout(TIMEOUT_MSEC)
|
|
|
|
|
.setConnectionRequestTimeout(TIMEOUT_MSEC)
|
|
|
|
|
.setSocketTimeout(TIMEOUT_MSEC).build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|