HttpClient 发送 form data 请求

 

HTTP 请求发送之后,服务端需要对请求数据进行解析,但是服务端并不知道请求给我的数据是什么,所以需要规定我按照什么规则进行解析,一般服务器都根据Content-Type 字段来明确请求数据是如何编码的,然后对其进行解析。Content-Type 常见的编码方式有:application/x-www-form-urlencoded,application/json,multipart/form-data,text/xml。

1、application/x-www-form-urlencoded

这是最常见的post请求的提交数据的方式,参数会按照key1=XXX&key2=XXX的方式进行提交。

2、application/json

现在这种方式越来越普遍,请求数据会按照json字符串的形式传送给服务器,此种方式适合处理复杂的数据。

3、multipart/form-data

一般form表单直接提交数据都会以此种方式进行,多用来进行上传文件。
如:
在这里插入图片描述
首先会生成一个 boundary 来分割各个字段, Content-Type 里指明用 mutipart/form-data 进行编码。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 –boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。

注:使用 HTTP Client 模拟此种类型请求时,header 会自动生成,不能手动设置,不然会获取不到数据。
代码演示:

        HttpResponse response;
        HttpClient client = HttpClients.createDefault();

        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();

//        entityBuilder.addBinaryBody("img",file, ContentType.MULTIPART_FORM_DATA,fileName);
        entityBuilder.addTextBody("userTel", userTel);
        entityBuilder.addTextBody("distinctId", distinctId);
        entityBuilder.addTextBody("buildingId", buildingId);
        entityBuilder.addTextBody("roomId", roomId);
        entityBuilder.addTextBody("equipmentId", equipmentId);
        entityBuilder.addTextBody("listDescription", listDescription);

        HttpEntity entity = entityBuilder.build();


        HttpPost post = new HttpPost(url);
        post.setEntity(entity);

        try {
            response = client.execute(post);
            Document doc = Jsoup.parse(EntityUtils.toString(response.getEntity()).replace(" ", ""));
            System.out.println(response);
            System.out.println(doc.text());

        } catch (IOException e) {
            e.printStackTrace();
        }

posted @ 2019-12-03 12:35  duniqb  阅读(7917)  评论(0编辑  收藏  举报