文档章节

HttpClient以及Json传递的一些坑

Hosee
 Hosee
发布于 2017/09/21 16:17
字数 366
阅读 1.2K
收藏 3

背景:

记录一下使用中关于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<NameValuePair> params = new ArrayList<NameValuePair>();
        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<NameValuePair> 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

© 著作权归作者所有

Hosee
粉丝 621
博文 135
码字总数 209956
作品 0
杭州
程序员
私信 提问
加载中

评论(0)

apache.commons.httpclient.HttpClient get/post请求

一、httpclient 发送请求的步骤(流程) 1、创建httpclient 对象 2、创建某种连接方式的对象 --如 GetMethod PostMethod 等对象,构造函数中是请求地址即url,如果是get请求可以在url后面添加...

QH_C
2015/04/13
221
0
org.apache.http.client.HttpClient get/post请求

请求步骤 1、创建httpclient 对象 2、创建 请求方式,构造函数的值为请求路径 3、调用1中对象的execute() 方法,参数为 2 的对象 4、获取请求响应数据 5、释放连接资源 6、处理数据 一、使...

QH_C
2015/04/14
388
0
Java11 HttpClient小试牛刀

序 本文主要研究一下Java11的HttpClient的基本使用。 变化 从java9的jdk.incubator.httpclient模块迁移到java.net.http模块,包名由jdk.incubator.http改为java.net.http 原来的诸如HttpRes...

go4it
2018/09/28
271
2
Apache HttpClient 没有设置time out导致应用长时间阻塞的问题

update 2014-5-18: 今天又处理了一个HttpClient阻塞的问题,还是socket read没有超时设置。 用jstack -l pid 得到线程的调用栈,每隔一段时间执行一次,对比三次的thread dump结果,发现有一...

横云断岭
2014/04/21
0
0
Apache HttpClient 资源释放、请求超时,导致线程池用光、内存不足

Apache HttpClient,据说很强大,可以支持峰值一秒7万以上的请求。不过需要注意一些资源释放和超时处理的问题。 问题1:线程资源无法释放,最终导致内存不足、或线程池被用光。 问题代码: ...

onedotdot
2018/10/17
531
0

没有更多内容

加载失败,请刷新页面

加载更多

007. J.U.C 之锁的使用

1. Lock API 1. Locks 包类层次结构 2. Lock 接口 方法签名 描述 void lock(); 获取锁(不死不休) boolean tryLock(); 获取锁(浅尝辄止) boolean tryLock(long time, TimeUnit unit) throws ......

紫穹
46分钟前
44
0
如何确定Python变量的类型? - How to determine a Python variable's type?

问题: How do I see the type of a variable whether it is unsigned 32 bit, signed 16 bit, etc.? 如何查看变量的类型,无论是无符号32位,带符号16位等等? How do I view it? 我该如何看...

javail
今天
150
0
略谈分布式系统中的容器设计模式

本文作者:zytan_cocoa 略谈分布式系统中的容器设计模式 谭中意 2020/3/5 前言:云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服...

百度开发者中心
03/11
158
0
a small thing that made me a little bit depressed

It was just two hours ago,specificly speaking It was 11:48 almost coming close to midneight. I was pratising singing songs in my renting room which is a sharing apartment . I re......

lost_myself
今天
130
0
OSChina 周日乱弹 —— 这中间几个月的地震、核爆、外星人、高达... 去哪了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Elizabeth》- Ashram 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :#共...

小小编辑
今天
265
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部