美文网首页
2018-05-01

2018-05-01

作者: Alibaba_14fe | 来源:发表于2018-05-01 15:20 被阅读0次
记录一下使用中关于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

      本文链接:https://www.haomeiwen.com/subject/dpnxrftx.html