记录一下使用中关于HttpClient以及Json传递的坑
HTTPS:
普通方式:
public class Test(){
URI uri = newURIBuilder().setScheme("http")
.setHost("***:**").setPath("/***/***").build();
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = newHttpPost(uri);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
List params = newArrayList();
params.add(newBasicNameValuePair("params", "test"));
HttpResponse httpResponse = httpClient.execute(httpPost);
StatusLine httpStatus = httpResponse.getStatusLine();
HttpEntity httpEntity = httpResponse.getEntity();
System.out.println("httpStatusline: "+ httpStatus);
System.out.println("strEntity: "+ EntityUtils.toString(httpEntity));
EntityUtils.consume(httpEntity);
}
}
这种适合普通的http的请求,当把Scheme换成https时,
报错:sun.security.validator.ValidatorException: PKIX path building failed
客户端没有证书,可以在代码中跳过证书验证。
public static String sendPost(finallURI uri, finallList params)
throwsClientProtocolException,
IOException,
NoSuchAlgorithmException,KeyManagementException {
String result = null;
SSLContext sslContext = SSLContext.getInstance("SSL");
// set up a TrustManager that trusts everything
sslContext.init(null, newTrustManager[] {
newX509TrustManager() {
publicX509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} }, newSecureRandom());
CloseableHttpClient httpclient = HttpClients.custom().
setSSLSocketFactory(newSSLSocketFactory(sslContext)).build();
HttpPost httpPost = newHttpPost(uri);
httpPost.addHeader("Content-type", "application/json");
httpPost.setEntity(newUrlEncodedFormEntity(params));
CloseableHttpResponse response = httpclient.execute(httpPost);
try{
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity);
EntityUtils.consume(entity);
} finally{
response.close();
}
returnresult;
}
request.getParameter无法得到appliation/json的数据
@ResponseBody
@RequestMapping(value = "/**/**.json", method = RequestMethod.POST)
public String valiate(ModelMap map, HttpServletRequest request) {
System.out.println(request.getParameter("param"));
}
这种方式无法得到Content-Type是appliation/json的数据。
这种方式适合Content-Type为application/x-www-form-urlencoded的请求。
解决:
@ResponseBody
@RequestMapping(value = "/**/**.json", method = RequestMethod.POST )
public String valiate(ModelMap map, @RequestBodyString request) {
JSONObject requestJson = JSON.parseObject(request);
}
这里需要说明的是@RequestBody需要接的参数是一个string化的json,而不是一个json对象,
也可以用对象类型来接收。
Reference:
1. http://blog.csdn.net/mack415858775/article/details/52388484
2. http://blog.csdn.net/g1248019684/article/details/50850386
2018-05-01
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...