Java Https工具类,Java Https Post请求
================================
©Copyright 蕃薯耀 2019-01-08
http://fanshuyao.iteye.com/
一、使用jsoup进行连接
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.X509TrustManager; import org.jsoup.Connection; import org.jsoup.Connection.Response; import org.jsoup.Jsoup; public class HttpsUtils { /** * 请求超时时间 */ private static final int TIME_OUT = 120000; /** * Https请求 */ private static final String HTTPS = "https"; /** * 返回成功状态码 */ private static final int OK = 200; /** * 纯字符串参数post请求 * * @param url 请求URL地址 * @param paramMap 请求字符串参数集合 * @return 服务器返回内容 * @throws Exception */ public static String post(String url, Map<String, String> paramMap) throws Exception { Response response = doPostRequest(url, paramMap, null); return response.body(); } /** * 带上传文件的post请求 * * @param url 请求URL地址 * @param paramMap 请求字符串参数集合 * @param fileMap 请求文件参数集合 * @return 服务器返回内容 * @throws Exception */ public static String post(String url, Map<String, String> paramMap, Map<String, File> fileMap) throws Exception { Response response = doPostRequest(url, paramMap, fileMap); return response.body(); } /** * 执行post请求 * * @param url 请求URL地址 * @param paramMap 请求字符串参数集合 * @param fileMap 请求文件参数集合 * @return 服务器相应对象 * @throws Exception */ public static Response doPostRequest(String url, Map<String, String> paramMap, Map<String, File> fileMap) throws Exception { if (null == url || url.isEmpty()) { throw new Exception("The request URL is blank."); } // 如果是Https请求 if (url.startsWith(HTTPS)) { getTrust(); } Connection connection = Jsoup.connect(url); //Connection connection = Jsoup.connect(url).url(new URL(null, url, new sun.net.www.protocol.https.Handler()));//可用 connection.method(Connection.Method.POST); connection.timeout(TIME_OUT); connection.header("Content-Type", "multipart/form-data"); connection.ignoreHttpErrors(true); connection.ignoreContentType(true); // 添加字符串类参数 if (null != paramMap && !paramMap.isEmpty()) { connection.data(paramMap); } // 添加文件参数 if (null != fileMap && !fileMap.isEmpty()) { InputStream in = null; File file = null; Set<Entry<String, File>> set = fileMap.entrySet(); try { for (Entry<String, File> e : set) { file = e.getValue(); in = new FileInputStream(file); connection.data(e.getKey(), file.getName(), in); } } catch (FileNotFoundException e) { throw new Exception(e.getMessage()); } } try { Response response = connection.execute(); if (response.statusCode() != OK) { throw new Exception(response.statusMessage()); } return response; } catch (IOException e) { throw new Exception(e); } } /** * 获取服务器信任 */ private static void getTrust() { try { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }); SSLContext context = SSLContext.getInstance("TLS"); context.init(null, new X509TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } } }
在可以连接互联网的时候没有问题,但在公司内网,访问不到互联网,只能访问某些接口时会出错,如下:
java.lang.Exception: javax.net.ssl.SSLKeyException: FATAL Alert:BAD_CERTIFICATE - A corrupt or unuseable certificate was received.
发现这个问题主要是Connection连接的问题。
如果修改Connection连接如下就可正常访问:
Connection connection = Jsoup.connect(url).url(new URL(null, url, new sun.net.www.protocol.https.Handler()));
或者:
Connection connection = Jsoup.connect(url).url(new URL(null, url, new sun.net.www.protocol.https.Handler())).validateTLSCertificates(false);
使用代理(未测试):
Connection connection = Jsoup.connect(url).url(new URL(null, url, new sun.net.www.protocol.https.Handler())).userAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
二、使用原生的HttpURLConnection连接
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.security.cert.CertificateException; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import javax.security.cert.X509Certificate; public class HttpsClientUtil { private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; private static void trustAllHosts() { // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; } public void checkClientTrusted(X509Certificate[] chain, String authType) { } public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public void checkClientTrusted( java.security.cert.X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted( java.security.cert.X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } }}; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } } public static String sendHtpps(String a,String url) { String result = ""; OutputStreamWriter out = null; BufferedReader in = null; HttpURLConnection conn; try { trustAllHosts(); URL realUrl = new URL(null,url,new sun.net.www.protocol.https.Handler()); //通过请求地址判断请求类型(http或者是https) if (realUrl.getProtocol().toLowerCase().equals("https")) { HttpsURLConnection https = (HttpsURLConnection) realUrl.openConnection(); https.setHostnameVerifier(DO_NOT_VERIFY); conn = https; } else { conn = (HttpURLConnection) realUrl.openConnection(); } // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); out.write(a); //错误方式,这种方式容易出现乱码 // PrintWriter out = new PrintWriter(connection.getOutputStream()); /*out.print(a);*/ // 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) { result = "sendHtpps error"; e.printStackTrace(); } finally {// 使用finally块来关闭输出流、输入流 try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } }
github两个比较好的Http请求工具,支持Https
1、https://github.com/kevinsawicki/http-request
<dependency> <groupId>com.github.kevinsawicki</groupId> <artifactId>http-request</artifactId> <version>6.0</version> </dependency>
2、https://github.com/hsiafan/requests
<dependency> <groupId>net.dongliu</groupId> <artifactId>requests</artifactId> <version>5.0.3</version> </dependency>
================================
©Copyright 蕃薯耀 2019-01-08
http://fanshuyao.iteye.com/
相关推荐
本篇文章将详细介绍如何使用Java语言实现Http和Https请求的工具类,包括如何建立Https连接、如何实现Post请求、如何处理SSL验证等内容。 在Java中,使用HttpURLConnection类可以实现Http和Https请求,但是对于...
本篇文章将深入探讨如何在Java中实现一个用于处理HTTPS请求的工具类。 首先,要实现HTTPS请求,我们需要导入Java的`java.net`和`javax.net.ssl`包,这两个包提供了处理网络连接和SSL/TLS安全协议的类。以下是一些...
4. **Java HTTPS工具类**: 工具类封装了HTTPS请求的实现细节,包括证书管理、SSL上下文配置等,使得开发者无需深入了解底层实现即可方便地发送HTTPS请求。 5. **SSL配置**: 在Java中,为了支持SSL,需要设置`SSL...
java的get和post请求,获取json的工具类,https时会存在ssl校验的问题,工具会自动去除ssl校验。
HTTP发送POST请求的工具类
本文将详细解析如何使用Java实现HTTP和HTTPS的GET与POST请求,并结合提供的类文件名称(HttpsHandler.java、HttpUtil.java、NetUtil.java)探讨可能的实现方式。 首先,`HttpUtil`类通常用于封装HTTP请求的操作。在...
public static String REQUEST_METHOD_POST = "POST"; public static String REQUEST_METHOD_GET = "GET"; // 媒体类型 public static String MIME_TYPE_FORM = "application/x-www-form-urlencoded;charset=...
"HttpUtils Java get post 工具类" 提供了便捷的方法来发送GET和POST请求,简化了网络请求的操作。以下是对这两个主要HTTP方法的详细解释以及如何在Java中实现它们。 **1. GET方法** GET是HTTP中最常见的请求方法,...
本篇文章将详细讲解一个简单的Java工具类,用于发送HTTP请求,该工具类名为HttpURLUtils。 首先,让我们理解HTTP协议的基本概念。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它定义了客户端(如...
本文将详细介绍一个封装了HTTP GET和POST请求的工具类,以及如何使用此类进行网络请求。该工具类支持HTTPS,确保数据传输的安全性。 首先,我们来看`HttpUtils`类,这是核心的网络请求工具类。在`HttpUtils`中,...
3. **发送HTTPS请求**:现在你可以使用HttpClient发送GET或POST请求了: ```java HttpGet request = new HttpGet("https://your.server.com/path"); HttpResponse response = httpClient.execute(request); int ...
org.springframework.web.client.AsyncRestTemplate org.springframework.web.client.RestTemplate HTTP请求工具类,基于以上两个Rest请求工具模板完成封装HTTP请求,包括同步和异步请求的实现。
在Java编程中,工具类(Util Classes)是包含各种实用方法的类,它们不持有状态,主要用于提供方便的静态方法。这些工具类极大地提升了代码的可读性和复用性。以下将详细介绍标题和描述中提到的一些关键工具类及其...
这是一个java发送get、post请求,并得到返回结果的工具类。
java模拟HTTP发送post和get请求工具类,使用httpClient类
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...
本知识点将深入讲解如何利用Java实现一个HTTPS客户端工具类,包括连接工具类和自定义的信任管理器。 首先,我们来看`HttpsUtils.java`这个文件。它很可能包含了用于发起HTTPS请求的核心方法。在Java中,我们可以...
java网络请求工具类 HttpURLConnection post请求工具类HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setRequestMethod("POST");// 提交模式