博文简介:
由于工作内容频繁对接第三方系统,用到HTTP的Get和Post进行数据传输,由于遇到表单
的的方式提交数据并交互时,多少有点懵逼。
实际大部分多以请求体的JSON进行交互的,少以表单形式提交POST请求的。是我能力菜
我有罪。所以,特意去学习 Apache HttpComponents 。
官方地址:Apache HttpComponents – Apache HttpComponents 感兴趣自行学习
组件版本:org.apache.httpcomponents:httpclient:4.5.2
已实现的方式:
1. GET 以URL参数编码发送,支持HTTPS
2. POST 以请求体JSON发送
3. POST 以表单的形式发送
注:https 的请求可自行参考 get 实现。
public class HttpUtil {// GET -----------------------------public static String get(String url) {return get(url, null);}// GET URL编码 ---------------------public static String get(String url, Map param) {return get(url, param, null, false);}// GET URL编码 SSL---------------------public static String gets(String url, Map param) {return get(url, param, null, true);}// GET URL编码指定字符集 ----------// url : 资源地址定位 ; param : url?后的参数 ; charSet : URL编码使用字符集,例如:UTF-8public static String get(String url, Map param, String charSet, boolean ssl) {CloseableHttpClient httpClient = ssl ? getHttpClient() : HttpClients.createDefault();HttpGet httpGet = new HttpGet(charSet == null ? addParams2Url(url, param) : addParams2UrlWithCharSet(url, param, charSet));RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000 * 2).setConnectionRequestTimeout(6000 * 2).setSocketTimeout(6000 * 2).build();httpGet.setConfig(requestConfig);try {// send get request : 发送GET请求CloseableHttpResponse response = httpClient.execute(httpGet);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != 200) return null;// do something useful with response body : 业务逻辑HttpEntity entity = response.getEntity();String res = EntityUtils.toString(entity, "UTF-8");EntityUtils.consume(entity);return res;} catch (Exception e) {} finally {try {httpClient.close();} catch (IOException e) {}}return null;}public static String addParams2Url(String url, Map params) {return addParams2UrlWithCharSet(url, params, null);}public static String addParams2UrlWithCharSet(String url, Map params, String charSet) {if (params == null || params.isEmpty()) {return url;}StringBuilder sb = new StringBuilder();try {for (Map.Entry entry : params.entrySet()) {sb.append("&").append(entry.getKey()).append("=");sb.append(charSet == null ? entry.getValue() : URLEncoder.encode(entry.getValue(), charSet));}if (!url.contains("?")) {sb.deleteCharAt(0).insert(0, "?");}} catch (Exception e) {}return url + sb;}// POST 以请求体JSON发送数据--------------------public static String postJson(String url, String data) {return postJson(url, null, data);}public static String postJson(String url, Map param, String data) {CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(addParams2Url(url, param));RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000 * 2).setConnectionRequestTimeout(6000 * 2).setSocketTimeout(6000 * 2).build();httpPost.setConfig(requestConfig);try {httpPost.setEntity(new StringEntity(data, ContentType.APPLICATION_JSON));CloseableHttpResponse response = httpClient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != 200) return null;HttpEntity entity = response.getEntity();String res = EntityUtils.toString(entity, "UTF-8");EntityUtils.consume(entity);response.close();return res;} catch (Exception e) {} finally {try {httpClient.close();} catch (Exception e) {}}return null;}// POST 以表单的形式发送数据-----------public static String postForm(String url, Map param, Map data) {CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(addParams2Url(url, param));RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000 * 2).setConnectionRequestTimeout(6000 * 2).setSocketTimeout(6000 * 2).build();httpPost.setConfig(requestConfig);try {// config header content-type is application/x-www-form-urlencoded : 配置HTTP的Header:content-typeContentType APPLICATION_FORM_URLENCODED_UTF8 = ContentType.create("application/x-www-form-urlencoded", Consts.UTF_8);Header[] headers = {new BasicHeader("Content-Type", APPLICATION_FORM_URLENCODED_UTF8.toString())};httpPost.setHeaders(headers);// add key-value pair to entity : 设置参数到请求体中List list = new ArrayList<>();for (Map.Entry entry : data.entrySet()) {list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}if (list.size() > 0) {UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");httpPost.setEntity(entity);}CloseableHttpResponse response = httpClient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != 200) return null;HttpEntity entity = response.getEntity();String res = EntityUtils.toString(entity, "UTF-8");EntityUtils.consume(entity);response.close();return res;} catch (Exception e) {} finally {try {httpClient.close();} catch (Exception e) {}}return null;}// HTTPS 的 POST 请求 --------------------public static CloseableHttpClient getHttpClient() {X509TrustManager trustManager = new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}};SSLContext context = null;try {context = SSLContext.getInstance("SSL");context.init(null, new TrustManager[]{trustManager}, null);return HttpClients.custom().setSSLSocketFactory(new SSLConnectionSocketFactory(context)).build();} catch (Exception e) {}return null;}}
希望得到你的参与和支持。 如果我们有做得不够的地方,请你指出。 谢谢!
修改时间:2022-11-13