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();
}