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();
}
没有修不好的电脑