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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM