读书人

客户端怎么使用httpclient向https服务

发布时间: 2012-08-25 10:06:20 作者: rapoo

客户端如何使用httpclient向https服务器发送数据

客户端向服务器发送数据时,份两种情况,SSL单向验证和SSL双向验证

?

1.SSL单向验证时

?

代码如下:

    import?java.io.IOException;??import?java.util.HashMap;??import?java.util.Map;????import?org.apache.commons.httpclient.HttpClient;??import?org.apache.commons.httpclient.HttpException;??import?org.apache.commons.httpclient.HttpStatus;??import?org.apache.commons.httpclient.NameValuePair;??import?org.apache.commons.httpclient.methods.PostMethod;??import?org.apache.commons.httpclient.params.HttpClientParams;??import?org.apache.commons.httpclient.params.HttpMethodParams;??import?org.apache.commons.logging.Log;??import?org.apache.commons.logging.LogFactory;????public?class?ClientSendData?{??????static?Log?log?=?LogFactory.getLog(ClientSendData.class);????????private?String?Url;????????//?初始化数据??????public?ClientSendData()?{??????????Url?=?"https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";??????}????????public?String?sendData(String?data)?{??????????String?receivedData?=?null;??????????try?{????????????????Map<String,?String>?paramsData?=?new?HashMap<String,?String>();??????????????paramsData.put("data",?data);??????????????receivedData?=?send(Url,?paramsData);??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}??????????return?receivedData;??????}????????public?static?String?send(String?url,?Map<String,?String>?paramsMap)?{??????????String?result?=?null;??????????PostMethod?postMethod?=?null;??????????HttpClient?httpClient?=?new?HttpClient();????????????httpClient.getParams().setParameter(??????????????????HttpMethodParams.HTTP_CONTENT_CHARSET,?"utf-8");??????????postMethod?=?new?PostMethod(url);????????????if?(paramsMap?!=?null?&&?paramsMap.size()?>?0)?{??????????????NameValuePair[]?datas?=?new?NameValuePair[paramsMap.size()];??????????????int?index?=?0;??????????????for?(String?key?:?paramsMap.keySet())?{??????????????????datas[index++]?=?new?NameValuePair(key,?paramsMap.get(key));??????????????}??????????????postMethod.setRequestBody(datas);????????????}????????????HttpClientParams?httparams?=?new?HttpClientParams();??????????httparams.setSoTimeout(60000);??????????postMethod.setParams(httparams);????????????try?{??????????????int?statusCode?=?httpClient.executeMethod(postMethod);??????????????if?(statusCode?==?HttpStatus.SC_OK)?{??????????????????result?=?postMethod.getResponseBodyAsString();??????????????????log.info("发送成功!");??????????????}?else?{??????????????????log.error("?http?response?status?is?"?+?statusCode);??????????????}????????????}?catch?(HttpException?e)?{??????????????log.error("error?url="?+?url,?e);??????????}?catch?(IOException?e)?{??????????????log.error("error?url="?+?url,?e);??????????}?finally?{??????????????if?(postMethod?!=?null)?{??????????????????postMethod.releaseConnection();??????????????}??????????}????????????return?result;??????}????????public?static?void?main(String[]?args)?{??????????ClientSendData?t?=?new?ClientSendData();??????????t.sendData("测试SSL单项连接,向服务端发送数据!");??????}??}??
?

可能出现的异常

1.java.net.ConnectException: Connection refused: connect

?

服务器没有启动

?

2 .javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

?

服务端的证书是不可信的。解决办法见这篇文章 http://zhuyuehua.iteye.com/blog/1102347

?

3.java.net.SocketException: Software caused connection abort: recv failed

?

这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。

?

4.org.apache.commons.httpclient.NoHttpResponseException

?

这一般是服务端防火墙的原因。拦截了客户端请求。

?

另外,当服务端负载过重时,也会出现此问题。

?

5.javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

?

这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。服务端验证客户端证书时,发现客户端没有证书,然后就断开了握手连接。

?

?

读书人网 >Web前端

热点推荐