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

本文探讨了SSL单向验证与双向验证的区别,以及在使用HTTP客户端发送数据时遇到的问题及解决方法,包括可能遇到的异常情况与应对策略。

客户端向服务器发送数据时,份两种情况,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双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。服务端验证客户端证书时,发现客户端没有证书,然后就断开了握手连接。

 

2.SSL双向验证时

 

双向验证时,暂时不知道如何用HTTPCLIENT发送数据,如需要双向验证时发送数据,参考我另外的文章。另外,有知道HTTPCLIENT如何在双向验证时发送数据的,恳请指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值