如何使用HttpsURLConnect和HttpClient实现访问https

最近将自己所开发设计的项目看了一下,总是不知道如何进行微信公众平台的java开发,作为一下新手来说,过程有点难受。
1、首先要查看微信平台的开发文档
https://mp.weixin.qq.com/wiki
2、里面大多都是涉及到如何对于https链接的请求
例如: 获取access_token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
对于appid和secret只需要在微信平台

一、 对于使用HttpsURLConnect来实现访问https,对于HttpsURLConnect的讲解我推荐这边文章:
http://blog.csdn.net/qh_java/article/details/52311226
这是我下面为了访问上面的代码实现的代码:

//get post方法通用
public static String getWxDate(String requesteUrl,String params,String requestMethod){
    OutputStream os=null;
    OutputStreamWriter osw=null;
    InputStream is=null;
    BufferReader reader=null;
    HttpsURLConnect conn=null;
    try{
        //先封装成url地址
        URL url=new URL(requestUrl);
        //获取此url的链接
        conn=(HttpsURLConnect)url.openConnect();
        //设置请求头信息

        conn.setRequestMethod(requestMethod);
        conn.setRequestProperty("Content-Length",String.valueOf(params.length());
        conn.setRequestProperty("Content-Type","text/xml,charset=\"UTF-8\"");
        //设置是否允许输入输出
        conn.setDoInput(true);
        conn.setDoOutput(true);

        //将所需要的参数写入进去
        os=conn.getOutputStream();
        osw=new OutputStreamWriter(os,"UTF-8"0;
        os.write(params);
        os.flush();

        //将结果获取到输出
        is=conn.getInnputStream();
        reader=new BufferReader(new OutputStreamReader(is,"UTF-8"));
        String str=null;
        while((str=reader.readerLine())!=null){
        return str;
    }catch(Exception e){
            e.getMessage();
    }finally{
        try{
            if(osw!=null){
                osw.close();
            }
            if(os!=null){
                os.close();
            }
            if(is!=null){
                is.close();
            }
            if(reader!=null){
                reader.close();
            }
        }catch(Exception e){
            e.getMessage();
        }
    }       
}

**请求头信息:**

这里写图片描述
content-length解读
这里写图片描述
这里的长队就是content-length的值

三、使用org.apache.common.HttpClient来实现访问https
什么是HttpClient?
百度理解为:
http://baike.baidu.com/link?url=_gKuBTJc3HqNGmSEoXyVwW0mlUE2joDRWH8SbFzp0KvppAn63bFrNTzJEQkWVbLXQlAb-ermhwoLBORmnH_1Ta
这里应该使用的是org.apache.common包下面的HttpClient来进行访问https
1、对于get方法无需传参的:

String requestUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=...&secret=...";
//获取client对象
HttpClient client=new HttpClient();
//创建某种方法的链接实例
GetMethod method=new GetMethod(requestUrl);
String str="";
try {
/**
*设置恢复策略
*原因如下:
*在执行的手,会引起两种错误;
*引起的第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,
*比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,
*并且该异常发生是不可恢复的;
*第二种异常一般是由于网络原因引起的异常,对于这种异常(IOException),
*HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。
*/
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//执行
client.executeMethod(method);
//获取返回值
byte[] bytes=method.getResponseBody();
str=new String(responseBodys);
} catch (HttpException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
sysout(str);

2、对于有参数的post方法

String access_token="J7QQq8RnfM35Ig_d6y5o.....";
String requestUrl="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+access_token;
HttpClient client=new HttpClient();
PostMethod method=new PostMethod(requestUrl);
String s=" {\"button\":[{\"type\":\"click\",\"name\":\"今日歌曲\",\"key\":\"V1001_TODAY_MUSIC\"},"
        +"{\"name\":\"菜单\",\"sub_button\":"
        + "[{\"type\":\"view\",\"name\":\"搜索\",\"url\":\"http://www.soso.com/\"},"
        + " {\"type\":\"view\",\"name\":\"视频\",\"url\":\"http://v.qq.com/\"},"
        + "{\"type\":\"click\",\"name\":\"赞一下我们\",\"key\":\"V1001_GOOD\"}]}] }";
/*方法1:对于设置参数是json字符串的*/
method.setRequestBody(s);
/*
加入想设置键值对类型的
NameValuePair[] pairs={new NameValuePari(name,value),new NameValuePari(name,value),.....};
method.setRequestBody(pairs);
*/
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());
client.executeMethod(method);
byte[] bytes=method.getResponseBody();
str=new String(responseBodys);
} catch (HttpException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
sysout(str);

四、使用org.apache.http.HttpClient来访问https(这个还未触及到)
文档理解:
http://www.tuicool.com/articles/QFJn6j7
这里我不太懂,求帮助(下面代码是copy的,加上了我自己的理解)

我就 举一个get的例子

try {  

                    HttpClient httpclient = new DefaultHttpClient();  
第一步:
                //初始化SchemeRegistry,设置访问协议 
                 //Scheme类表示一个协议方案,例如"http"或者"https"和包含许多的协议属性, 
                //例如缺省的端口和socket工厂常用于为指定的协议创建
                //java.net.Socket实例,SchemeRegistry类被用来维护一个
                //Schemes的集合
    //sslcontext->trustmanager->sslscoketfactory->schemeregister 
                //1.1创建一个SSLSocketFactory工厂
                /*
                HTTPS (全称: Hypertext Transfer Protocol over Secure Socket Layer ),
                是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。
                即 HTTP 下加入 SSL 层, HTTPS 的安全基础是 SSL ,因此加密的详细内容就需要 SSL 。
                */
                SSLContext context=new SSLContext("SSL");//这里面是protocol协议

                X509TrustManager tm = new X509TrustManager() {  

                                        public void checkClientTrusted(X509Certificate[] xcs,  
                                                String string) throws CertificateException {  

                                        }  

                                        public void checkServerTrusted(X509Certificate[] xcs,  
                                                String string) throws CertificateException {  
                                        }  

                                        public X509Certificate[] getAcceptedIssuers() {  
                                            return null;  
                                        }  
                                    };  
                ctx.init(null,new TrustManager[]{tm},null);
                SSLScoketFactory ssf=new SSLScoketFactory(ctx);

                    //第1.2
                    ClientConnectionManager ccm = httpclient.getConnectionManager();  

                    //第1.3
                    SchemeRegistry sr = ccm.getSchemeRegistry();  
                    sr.register(new Scheme("https", 443, ssf));  //这里的443请看上面的文档
                    sr.register(new Scheme("https", 443, ssf));  


                    HttpGet httpget = new HttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx806e47f2a024adda&secret=ca456a04cfdec7e688c99c155c9b83e2");  
                    HttpParams params = httpclient.getParams();  
                    params.setParameter("param1", "paramValue1");  
                    httpget.setParams(params);  
                    System.out.println("REQUEST:" + httpget.getURI());  //请求的url地址


                    ResponseHandler responseHandler = new BasicResponseHandler();  
                    String responseBody;  
                    responseBody = httpclient.execute(httpget, responseHandler);  
                    System.out.println(responseBody);  
                    // Create a response handler  

        } catch (ClientProtocolException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
        } catch (IOException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
        } catch (Exception ex) {  
        ex.printStackTrace();  
        }               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值