100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > HttpClient 同时支持发送http及htpps请求

HttpClient 同时支持发送http及htpps请求

时间:2024-08-20 04:43:39

相关推荐

HttpClient 同时支持发送http及htpps请求

HttpClient简述:

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。HTTP Client和浏览器有点像,都可以用来发送请求,接收服务端响应的数据。但它不是浏览器,没有用户界面。HttpClient是一个客户端的http通信实现库,这个类库的作用是接收和发送http报文,使用这个类库,它相比传统的 HttpURLConnection,增加了易用性和灵活性,我们对于http的操作会变得简单一些,只通过其API用于传输和接受HTTP消息。

不同httpclient版本其请求发送的方式也不一样。

httpclient4.3以上使用CloseableHttpClient httpClient = HttpClients.createDefault();

httpclient4.x到httpclient4.3以下使用HttpClient client = new DefaultHttpClient();

httpclient3.x使用HttpClient client = new HttpClient();

httpclient3.x版本

HttpClient client = new HttpClient();

// 设置代理服务器地址和端口

// client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);

// 使用 GET 方法 ,如果服务器需要通过 HTTPS 连接,那只需要将下面 URL 中的 http 换成 https

HttpMethodmethod = new GetMethod("http://10.10.10.10/test");

// 使用POST方法

// HttpMethod method = new PostMethod("http://10.10.10.10/test");

client.executeMethod(method);

// 输出服务器返回的状态

log.info(method.getStatusLine());

// 输出返回的信息

log.info(method.getResponseBodyAsString());

// 释放连接

method.releaseConnection();

httpclient4.x到httpclient4.3以下

public void get(String url, String encoding) throws ClientProtocolException, IOException {HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(url);HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();if (entity != null) {InputStream instream = entity.getContent();try {BufferedReader reader = new BufferedReader(new InputStreamReader(instream, encoding));System.out.println(reader.readLine());} catch (Exception e) {e.printStackTrace();} finally {instream.close();}}// 关闭连接.client.getConnectionManager().shutdown();}

httpclient4.3以上

import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;public static String get(String urlStr) {CloseableHttpClient httpClient = HttpClients.createDefault();// HTTP Get请求HttpGet httpGet = new HttpGet(urlStr);// 设置请求和传输超时时间// RequestConfig requestConfig =// RequestConfig.custom().setSocketTimeout(TIME_OUT).setConnectTimeout(TIME_OUT).build();// httpGet.setConfig(requestConfig);String result = "";try {// 执行请求HttpResponse getAddrResp = httpClient.execute(httpGet);HttpEntity entity = getAddrResp.getEntity();if (entity != null) {result = EntityUtils.toString(entity);}log.info("响应" + getAddrResp.getStatusLine());} catch (Exception e) {log.error(e.getMessage(), e);return result;} finally {try {httpClient.close();} catch (IOException e) {log.error(e.getMessage(), e);return result;}}return result;}

本次使用HttpClient-4.5.5版本,具体操作如下

1、在pom.xml增加以下配置

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.10</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId></dependency>

2、新建HttpClient封装类,封装get,put,delete,post请求

代码:

package com.example.oauth_test.util;import java.io.IOException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;import lombok.extern.slf4j.Slf4j;import org.apache.http.*;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.*;import org.apache.http.config.Registry;import org.apache.http.config.RegistryBuilder;import org.apache.http.conn.socket.ConnectionSocketFactory;import org.apache.http.conn.socket.LayeredConnectionSocketFactory;import org.apache.http.conn.socket.PlainConnectionSocketFactory;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.SSLContexts;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.ponent;import .ssl.SSLContext;/*** @author wly* @date -05-17 17:31:25* @describe HttpClient同时支持发送http及htpps请求*/@Component@Slf4jpublic class HttpClientUtils {private static int SocketTimeout = 5000;//5秒private static int ConnectTimeout = 5000;//5秒private static Boolean SetTimeOut = true;private static CloseableHttpClient getHttpClient() {RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.<ConnectionSocketFactory>create();ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory();registryBuilder.register("http", plainSF);//指定信任密钥存储对象和连接套接字工厂try {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());//信任任何链接TrustStrategy anyTrustStrategy = new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {return true;}};SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build();LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);registryBuilder.register("https", sslSF);} catch (KeyStoreException e) {throw new RuntimeException(e);} catch (KeyManagementException e) {throw new RuntimeException(e);} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}Registry<ConnectionSocketFactory> registry = registryBuilder.build();//设置连接管理器PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);//connManager.setDefaultConnectionConfig(connConfig);//connManager.setDefaultSocketConfig(socketConfig);//构建客户端return HttpClientBuilder.create().setConnectionManager(connManager).build();}/*** @param url请求的url* @describe get* @param queries 请求的参数,在url?后面的数据,可以传null* @return* @throws IOException*/public static String get(String url,Map<String, String> queries) throws IOException {log.info("get请求……");String responseBody = "";//CloseableHttpClient httpClient=HttpClients.createDefault();//支持http及https请求CloseableHttpClient httpClient = getHttpClient();StringBuilder sb = new StringBuilder(url);if (queries != null && queries.keySet().size() > 0) {boolean firstFlag = true;Iterator iterator = queries.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry<String, String>) iterator.next();if (firstFlag) {sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());firstFlag = false;} else {sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());}}}HttpGet httpGet = new HttpGet(sb.toString());if (SetTimeOut) {RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(SocketTimeout).setConnectTimeout(ConnectTimeout).build();//设置请求和传输超时时间httpGet.setConfig(requestConfig);}try {log.info("正在执行请求是: " + httpGet.getRequestLine());//请求数据CloseableHttpResponse response = httpClient.execute(httpGet);System.out.println(response.getStatusLine());int status = response.getStatusLine().getStatusCode();if (status == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();responseBody = EntityUtils.toString(entity);} else {log.info("http返回错误状态:" + status);throw new ClientProtocolException("未知响应状态: " + status);}} catch (Exception ex) {ex.printStackTrace();} finally {httpClient.close();}return responseBody;}/*** @param url请求的url* @describe put* @param queries 请求的参数,在url?后面的数据,可以传null* @return* @throws IOException*/public static String put(String url,Map<String, String> queries) throws IOException {log.info("put请求……");String responseBody = "";//CloseableHttpClient httpClient=HttpClients.createDefault();//支持http及https请求CloseableHttpClient httpClient = getHttpClient();StringBuilder sb = new StringBuilder(url);if (queries != null && queries.keySet().size() > 0) {boolean firstFlag = true;Iterator iterator = queries.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry<String, String>) iterator.next();if (firstFlag) {sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());firstFlag = false;} else {sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());}}}HttpPut httpPut = new HttpPut(sb.toString());if (SetTimeOut) {RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(SocketTimeout).setConnectTimeout(ConnectTimeout).build();//设置请求和传输超时时间httpPut.setConfig(requestConfig);}try {log.info("正在执行请求是:" + httpPut.getRequestLine());//请求数据CloseableHttpResponse response = httpClient.execute(httpPut);System.out.println(response.getStatusLine());int status = response.getStatusLine().getStatusCode();if (status == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();responseBody = EntityUtils.toString(entity);} else {log.info("http返回错误状态:" + status);throw new ClientProtocolException("未知响应状态: " + status);}} catch (Exception ex) {ex.printStackTrace();} finally {httpClient.close();}return responseBody;}/*** @param url请求的url* @describe delete* @param queries 请求的参数,在url?后面的数据,可以传null* @return* @throws IOException*/public static String delete(String url,Map<String, String> queries) throws IOException {log.info("delete请求……");String responseBody = "";//CloseableHttpClient httpClient=HttpClients.createDefault();//支持http及https请求CloseableHttpClient httpClient = getHttpClient();StringBuilder sb = new StringBuilder(url);if (queries != null && queries.keySet().size() > 0) {boolean firstFlag = true;Iterator iterator = queries.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry<String, String>) iterator.next();if (firstFlag) {sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());firstFlag = false;} else {sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());}}}HttpDelete httpDelete = new HttpDelete(sb.toString());if (SetTimeOut) {RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(SocketTimeout).setConnectTimeout(ConnectTimeout).build();//设置请求和传输超时时间httpDelete.setConfig(requestConfig);}try {log.info("正在执行请求是:" + httpDelete.getRequestLine());//请求数据CloseableHttpResponse response = httpClient.execute(httpDelete);System.out.println(response.getStatusLine());int status = response.getStatusLine().getStatusCode();if (status == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();responseBody = EntityUtils.toString(entity);} else {log.info("http返回错误状态:" + status);throw new ClientProtocolException("未知响应状态: " + status);}} catch (Exception ex) {ex.printStackTrace();} finally {httpClient.close();}return responseBody;}/*** @param url请求的url* @describe post* @param queries 请求的参数,在浏览器?后面的数据,没有可以传null* @param params post form 提交的参数* @return* @throws IOException*/public static String post(String url, Map<String, String> queries, Map<String, String> params) throws IOException {log.info("post请求……");String responseBody = "";//CloseableHttpClient httpClient = HttpClients.createDefault();//支持httpsCloseableHttpClient httpClient = getHttpClient();StringBuilder sb = new StringBuilder(url);if (queries != null && queries.keySet().size() > 0) {boolean firstFlag = true;Iterator iterator = queries.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry<String, String>) iterator.next();if (firstFlag) {sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());firstFlag = false;} else {sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());}}}HttpPost httpPost = new HttpPost(sb.toString());if (SetTimeOut) {RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(SocketTimeout).setConnectTimeout(ConnectTimeout).build();//设置超时时间httpPost.setConfig(requestConfig);}//添加参数List<NameValuePair> nvps = new ArrayList<NameValuePair>();if (params != null && params.keySet().size() > 0) {Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();nvps.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue()));}}httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));//请求数据CloseableHttpResponse response = httpClient.execute(httpPost);try {System.out.println(response.getStatusLine());if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();responseBody = EntityUtils.toString(entity);} else {log.info("http返回错误状态:" + response.getStatusLine().getStatusCode());}} catch (Exception e) {e.printStackTrace();} finally {response.close();}return responseBody;}}

3、调用验证

代码

package com.example.oauth_test.controller;import com.example.oauth_test.util.HttpClientUtils;import com.example.oauth_test.util.httpRequestUtil;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.io.IOException;import java.util.HashMap;import java.util.Map;/*** @author wly* @date -05-17 15:45:12*/@RestController@Slf4jpublic class test {@Autowiredpublic httpRequestUtil httpRequestUtil;@Autowiredprivate HttpClientUtils httpClientUtils;private String applicationJson = "application/json";private String applicationStr = "application/X-WWW-form-urlencoded";@GetMapping("/testGet")public String testGet(String a) {return "Get-调用成功!";}@PutMapping("/testPut")public String testPut(String a) {return "Put-调用成功!";}@DeleteMapping("/testDelete")public String testDelete(String a) {return "Delete-调用成功!";}@PostMapping("/testPost")public String testPost(String a) {return "Post-调用成功!";}@GetMapping("/test")public String testtre() throws IOException {Map<String, String> parm = new HashMap<String, String>();parm.put("a","123");String wxResult = httpClientUtils.get("http://127.0.0.1:8010/testGet",parm);// String wxResult = httpClientUtils.put("http://127.0.0.1:8010/testPut",parm);// String wxResult = httpClientUtils.delete("http://127.0.0.1:8010/testDelete",parm);// String wxResult = httpClientUtils.post("http://127.0.0.1:8010/testPost",parm,parm);return wxResult;}}

4、验证结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。