zoukankan      html  css  js  c++  java
  • UrlConnection doPost Https请求 、编码设置

    UrlConnection doPost Https请求 、编码设置

    UrlConnection doPost方法

    /**
     * 发送POST请求
     *
     * @param url         请求地址url
     * @param params      需要发送的请求参数字符串
     * @param connTimeout 连接超时时间(毫秒),如果为null则默认为180秒
     * @param readTimeout 读取超时时间(毫秒),如果为null则默认为180秒
     * @return 请求响应内容,如果为null则表示请求异常
     */
    public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType)
    {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try
        {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接,根据url
            URLConnection conn = 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", contentType == null? "application/json" : contentType);
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
    
            // 设置请求超时时间和读取超时时间
            conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout);
            conn.setReadTimeout(readTimeout == null ? 180 : readTimeout);
    
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(params);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null)
                result += line;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            result = null;
        }
        //使用finally块来关闭输出流、输入流
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
                if (in != null)
                {
                    in.close();
                }
            }
            catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
        return result;
    }
    

    设置请求和返回数据 utf-8 编码的 doPost 方法

    定义请求数据utf-8编码
    out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
    定义返回数据 utf-8编码
    in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
    

    完整设置编码的doPost方法

    /**
     * 发送POST请求
     *
     * @param url         请求地址url
     * @param params      需要发送的请求参数字符串
     * @param connTimeout 连接超时时间(毫秒),如果为null则默认为180秒
     * @param readTimeout 读取超时时间(毫秒),如果为null则默认为180秒
     * @return 请求响应内容,如果为null则表示请求异常
     */
    public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType)
    {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try
        {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接,根据url
            URLConnection conn = 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", contentType == null? "application/json" : contentType);
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
    
            // 设置请求超时时间和读取超时时间
            conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout);
            conn.setReadTimeout(readTimeout == null ? 180 : readTimeout);
    
            // 获取URLConnection对象对应的输出流,设置utf-8编码
            out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
            // 发送请求参数
            out.print(params);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应,设置utf-8编码
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            String line;
            while ((line = in.readLine()) != null)
                result += line;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            result = null;
        }
        //使用finally块来关闭输出流、输入流
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
                if (in != null)
                {
                    in.close();
                }
            }
            catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
        return result;
    }
    

    兼容http请求和https请求的doPost方法

    https请求绕过https验证
    具体见下方代码

    import javax.net.ssl.*;
    import java.io.*;
    import java.net.URL;
    import java.net.URLConnection;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    /**
     * Created by DawnHeaven on 16-4-20.
     */
    public class PostUtils {
        /**
         * 忽视证书HostName
         */
        private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
            public boolean verify(String s, SSLSession sslsession) {
                //System.out.println("WARNING: Hostname is not matched for cert.");
                return true;
            }
        };
    
        /**
         * Ignore Certification
         */
        private static TrustManager ignoreCertificationTrustManger = new X509TrustManager() {
            private X509Certificate[] certificates;
    
            public void checkClientTrusted(X509Certificate certificates[],
                                           String authType) throws CertificateException {
                if (this.certificates == null) {
                    this.certificates = certificates;
                    //System.out.println("init at checkClientTrusted");
                }
    
            }
    
            public void checkServerTrusted(X509Certificate[] ax509certificate,
                                           String s) throws CertificateException {
                if (this.certificates == null) {
                    this.certificates = ax509certificate;
                    //System.out.println("init at checkServerTrusted");
                }
            }
    
            public X509Certificate[] getAcceptedIssuers() {
                // TODO Auto-generated method stub
                return null;
            }
        };
    
        /**
         * 获取UrlConn
         */
        public static URLConnection geneUrlConn(String urlstr) throws Exception {
            URL url = new URL(urlstr);
            if(urlstr.startsWith("https://")){
                HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
                HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection();
    
                // Prepare SSL Context
                TrustManager[] tm = { ignoreCertificationTrustManger };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
    
    
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();
                httpsConnection.setSSLSocketFactory(ssf);
    
                return httpsConnection;
            }
            else {
                return  url.openConnection();
            }
        }
    
    
    
        /**
         * 发送POST请求
         *
         * @param url         请求地址url
         * @param params      需要发送的请求参数字符串
         * @param connTimeout 连接超时时间(毫秒),如果为null则默认为30秒
         * @param readTimeout 读取超时时间(毫秒),如果为null则默认为60秒
         * @return 请求响应内容,如果为null则表示请求异常
         */
        public static String doPost(String url, String params, Integer connTimeout, Integer readTimeout, String contentType)
        {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            try
            {
                //            URL realUrl = new URL(url);
                // 打开和URL之间的连接,根据url
                URLConnection conn = geneUrlConn(url);
                // 设置通用的请求属性
                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", contentType == null? "application/json" : contentType);
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
    
                // 设置请求超时时间和读取超时时间
                conn.setConnectTimeout(connTimeout == null ? 180 : connTimeout);
                conn.setReadTimeout(readTimeout == null ? 180 : readTimeout);
    
                // 获取URLConnection对象对应的输出流
                out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
                // 发送请求参数
                out.print(params);
                // 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)
            {
                e.printStackTrace();
                result = null;
            }
            //使用finally块来关闭输出流、输入流
            finally
            {
                try
                {
                    if (out != null)
                    {
                        out.close();
                    }
                    if (in != null)
                    {
                        in.close();
                    }
                }
                catch (IOException ex)
                {
                    ex.printStackTrace();
                }
            }
            return result;
        }
    }
  • 相关阅读:
    C#与SAP进行数据交互
    自动加减工单结存算法实现
    RDLC报表打印一维码
    调用存储过程通用类
    监听网络状态
    压缩及解压缩文件
    用Go造轮子-管理集群中的配置文件
    2015年总结
    浅析Go语言的Interface机制
    2014年总结
  • 原文地址:https://www.cnblogs.com/dawnheaven/p/5414783.html
Copyright © 2011-2022 走看看