您的位置:首页 > 理论基础 > 计算机网络

HttpsURLConnection实现SSL的GET/POST请求

2017-10-11 10:42 417 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

[html] view
plain copy

package org.nercita.weixin.util;  

  

import java.security.cert.CertificateException;  

import java.security.cert.X509Certificate;  

  

import javax.net.ssl.X509TrustManager;  

  

/**  

 * 证书信任管理器(用于https请求)  

 * 这个证书管理器的作用就是让它信任我们指定的证书,下面的代码意味着信任所有证书,不管是否权威机构颁发。  

 * @author zhangwenchao  

 *  

 */  

public class MyX509TrustManager implements  X509TrustManager{  

  

    @Override  

    public void checkClientTrusted(X509Certificate[] chain, String authType)  

            throws CertificateException {  

          

          

    }  

  

    @Override  

    public void checkServerTrusted(X509Certificate[] chain, String authType)  

            throws CertificateException {  

          

          

    }  

  

    @Override  

    public X509Certificate[] getAcceptedIssuers() {  

  

        return null;  

    }  

  

  

  

}  

[html] view
plain copy

package org.nercita.weixin.util;  

  

import java.io.BufferedReader;    

import java.io.InputStream;    

import java.io.InputStreamReader;    

import java.io.OutputStream;    

import java.net.ConnectException;    

import java.net.URL;    

    

import javax.net.ssl.HttpsURLConnection;    

import javax.net.ssl.SSLContext;    

import javax.net.ssl.SSLSocketFactory;    

import javax.net.ssl.TrustManager;    

    

import net.sf.json.JSONException;  

import net.sf.json.JSONObject;    

    

import org.nercita.weixin.domain.AccessToken;  

import org.nercita.weixin.domain.Menu;  

import org.slf4j.Logger;    

import org.slf4j.LoggerFactory;  

/**  

 * 公众平台通用接口工具类   

 * 用户实现https请求  

 * @author zhangwenchao  

 *  

 */  

public class HttpsRequestUtil {  

      

    private static Logger logger = LoggerFactory.getLogger(HttpsRequestUtil.class);   

      

    // 获取access_token接口的地址(GET) 限200(次/天)   

    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";   

      

    // 菜单创建(POST) 限100(次/天)     

    public static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";  

       

      

      

    /**   

     * 发起https请求并获取结果   

     *    

     * @param requestUrl 请求地址   

     * @param requestMethod 请求方式(GET、POST)   

     * @param outputStr 提交的数据   

     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)   

     */    

    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {    

        JSONObject jsonObject = null;    

        StringBuffer buffer = new StringBuffer();    

        try {    

              

            // 创建SSLContext对象,并使用我们指定的信任管理器初始化     

            TrustManager[] tm = { new MyX509TrustManager() };    

            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");    

            sslContext.init(null, tm, new java.security.SecureRandom());    

              

            // 从上述SSLContext对象中得到SSLSocketFactory对象     

            SSLSocketFactory ssf = sslContext.getSocketFactory();    

    

            //打开连接  

            URL url = new URL(requestUrl);    

            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();    

            httpUrlConn.setSSLSocketFactory(ssf);    

            httpUrlConn.setDoOutput(true);    

            httpUrlConn.setDoInput(true);    

            httpUrlConn.setUseCaches(false);    

              

            // 设置请求方式(GET/POST)     

            httpUrlConn.setRequestMethod(requestMethod);    

    

            if ("GET".equalsIgnoreCase(requestMethod)){    

                httpUrlConn.connect();    

            }  

            // 当有数据需要提交时     

            if (null != outputStr) {    

                OutputStream outputStream = httpUrlConn.getOutputStream();    

                // 注意编码格式,防止中文乱码     

                outputStream.write(outputStr.getBytes("UTF-8"));    

                outputStream.close();    

            }    

    

            // 将返回的输入流转换成字符串     

            InputStream inputStream = httpUrlConn.getInputStream();    

            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");    

            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);    

            String str = null;    

            while ((str = bufferedReader.readLine()) != null) {    

                buffer.append(str);    

            }    

            bufferedReader.close();    

            inputStreamReader.close();    

            // 释放资源     

            inputStream.close();    

            inputStream = null;    

            httpUrlConn.disconnect();    

            jsonObject = JSONObject.fromObject(buffer.toString());    

        } catch (ConnectException ce) {    

            logger.error("Weixin server connection timed out.");    

        } catch (Exception e) {    

            logger.error("https request error:{}", e);    

        }    

        return jsonObject;    

    }   

      

      

      

    /**   

     * 获取access_token   

     * 微信服务器会返回json格式的数据:{"access_token":"ACCESS_TOKEN","expires_in":7200}  

     * @param appid 凭证   

     * @param appsecret 密钥   

     * @return   

     */    

    public static AccessToken getAccessToken(String appid, String appsecret) {    

        AccessToken accessToken = null;    

        String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);    

        JSONObject jsonObject = httpRequest(requestUrl, "GET", null);    

        // 如果请求成功     

        if (null != jsonObject) {    

            try {    

                accessToken = new AccessToken();    

                accessToken.setAccessToken(jsonObject.getString("access_token"));    

                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));    

            } catch (JSONException e) {    

                accessToken = null;    

                // 获取token失败     

                logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));    

            }    

        }    

        return accessToken;    

    }  

      

      

      

    /**   

     * 创建菜单   

     *    

     * @param menu 菜单实例   

     * @param accessToken 有效的access_token   

     * @return 0表示成功,其他值表示失败   

     */    

    public static int createMenu(Menu menu, String accessToken) {    

        int result = 0;    

        

        // 拼装创建菜单的url     

        String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);    

        // 将菜单对象转换成json字符串     

        String jsonMenu = JSONObject.fromObject(menu).toString();    

        // 调用接口创建菜单     

        JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);    

        

        if (null != jsonObject) {    

            if (0 != jsonObject.getInt("errcode")) {    

                result = jsonObject.getInt("errcode");    

                logger.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));    

            }    

        }    

        

        return result;    

    }   

  

      

      

  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: