`
阅读更多

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/

  • 大小: 13.7 KB
  • 大小: 12.3 KB
2
0
分享到:
评论
2 楼 masuweng 2019-02-27  
       
1 楼 蕃薯耀 2019-01-08  
Java Https工具类
Java Https Post请求
jsoup https请求
FATAL Alert:BAD_CERTIFICATE - A corrupt or unuseable certificate was received

========
蕃薯耀

相关推荐

    Https请求工具类,Java实现http请求,https请求

    本篇文章将详细介绍如何使用Java语言实现Http和Https请求的工具类,包括如何建立Https连接、如何实现Post请求、如何处理SSL验证等内容。 在Java中,使用HttpURLConnection类可以实现Http和Https请求,但是对于...

    Java实现的Https请求工具类

    本篇文章将深入探讨如何在Java中实现一个用于处理HTTPS请求的工具类。 首先,要实现HTTPS请求,我们需要导入Java的`java.net`和`javax.net.ssl`包,这两个包提供了处理网络连接和SSL/TLS安全协议的类。以下是一些...

    Java发 Https请求工具类 支持SSL

    4. **Java HTTPS工具类**: 工具类封装了HTTPS请求的实现细节,包括证书管理、SSL上下文配置等,使得开发者无需深入了解底层实现即可方便地发送HTTPS请求。 5. **SSL配置**: 在Java中,为了支持SSL,需要设置`SSL...

    https的get和post请求,去除ssl校验的java工具类

    java的get和post请求,获取json的工具类,https时会存在ssl校验的问题,工具会自动去除ssl校验。

    HTTP发送POST请求的工具类

    HTTP发送POST请求的工具类

    JAVA 发送http请求工具类

    本文将详细解析如何使用Java实现HTTP和HTTPS的GET与POST请求,并结合提供的类文件名称(HttpsHandler.java、HttpUtil.java、NetUtil.java)探讨可能的实现方式。 首先,`HttpUtil`类通常用于封装HTTP请求的操作。在...

    http/https请求工具类

    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 工具类

    "HttpUtils Java get post 工具类" 提供了便捷的方法来发送GET和POST请求,简化了网络请求的操作。以下是对这两个主要HTTP方法的详细解释以及如何在Java中实现它们。 **1. GET方法** GET是HTTP中最常见的请求方法,...

    java发送http请求工具类

    本篇文章将详细讲解一个简单的Java工具类,用于发送HTTP请求,该工具类名为HttpURLUtils。 首先,让我们理解HTTP协议的基本概念。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它定义了客户端(如...

    http发送Get和Post请求工具类

    本文将详细介绍一个封装了HTTP GET和POST请求的工具类,以及如何使用此类进行网络请求。该工具类支持HTTPS,确保数据传输的安全性。 首先,我们来看`HttpUtils`类,这是核心的网络请求工具类。在`HttpUtils`中,...

    java 发送https 请求 证书

    3. **发送HTTPS请求**:现在你可以使用HttpClient发送GET或POST请求了: ```java HttpGet request = new HttpGet("https://your.server.com/path"); HttpResponse response = httpClient.execute(request); int ...

    HTTP请求客户端工具类RestTemplateUtil.java

    org.springframework.web.client.AsyncRestTemplate org.springframework.web.client.RestTemplate HTTP请求工具类,基于以上两个Rest请求工具模板完成封装HTTP请求,包括同步和异步请求的实现。

    java常用工具类

    在Java编程中,工具类(Util Classes)是包含各种实用方法的类,它们不持有状态,主要用于提供方便的静态方法。这些工具类极大地提升了代码的可读性和复用性。以下将详细介绍标题和描述中提到的一些关键工具类及其...

    Java发送Http请求工具类

    这是一个java发送get、post请求,并得到返回结果的工具类。

    Java发送post,get请求

    java模拟HTTP发送post和get请求工具类,使用httpClient类

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    ### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...

    https客户端java实现工具类

    本知识点将深入讲解如何利用Java实现一个HTTPS客户端工具类,包括连接工具类和自定义的信任管理器。 首先,我们来看`HttpsUtils.java`这个文件。它很可能包含了用于发起HTTPS请求的核心方法。在Java中,我们可以...

    java网络请求工具类 HttpURLConnection

    java网络请求工具类 HttpURLConnection post请求工具类HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setRequestMethod("POST");// 提交模式

Global site tag (gtag.js) - Google Analytics