httpclient mysql_HttpClient以及Json传递的一些坑

背景:

记录一下使用中关于HttpClient以及Json传递的坑。

HTTPS:

普通方式:

public class Test {

public static void main(String[] args) throws Exception {

URI uri = new URIBuilder().setScheme("http").setHost("***:**")

.setPath("/***/***").build();

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost httpPost = new HttpPost(uri);

httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");

List params = new ArrayList();

params.add(new BasicNameValuePair("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(final URI uri,

final List params) throws ClientProtocolException,

IOException,

NoSuchAlgorithmException,

KeyManagementException {

String result = null;

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

// set up a TrustManager that trusts everything

sslContext.init(null, new TrustManager[] { new X509TrustManager() {

public X509Certificate[] getAcceptedIssuers() {

return null;

}

public void checkClientTrusted(X509Certificate[] certs, String authType) {

}

public void checkServerTrusted(X509Certificate[] certs, String authType) {

}

} }, new SecureRandom());

CloseableHttpClient httpclient = HttpClients.custom()

.setSSLSocketFactory(new SSLSocketFactory(sslContext)).build();

HttpPost httpPost = new HttpPost(uri);

httpPost.addHeader("Content-type", "application/json");

httpPost.setEntity(new UrlEncodedFormEntity(params));

CloseableHttpResponse response = httpclient.execute(httpPost);

try {

HttpEntity entity = response.getEntity();

result = EntityUtils.toString(entity);

EntityUtils.consume(entity);

} finally {

response.close();

}

return result;

}

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, @RequestBody String 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值