1. 程式人生 > >使用HttpClient4,post提交multipart/form-data資料

使用HttpClient4,post提交multipart/form-data資料

問題由來:

  在Vert.x的專案中,進行公眾號開發的時候,發現回覆使用者圖片的時候需要先上傳圖片,獲取一個media_id,然後拿著這個media_id去傳送資料。

  問題是,Vert.x的vertx-web-client不提供表單檔案上傳(form-data)方式post請求。

          於是,只能找一個HttpClient方法。發現組裝一個這樣的請求,並不簡單

解決方案:

  用HttpClient4可實現的,下面看看實現方法:

          於是有程式碼:

HttpClient httpClient = new DefaultHttpClient();

換成:

HttpClient httpClient = HttpClients.createDefault();
   

        所有程式碼如下:

String postUrl = "https://" + Constants.WX_INTERFACE_HOST + "/cgi-bin/media/upload?access_token="
+ accessToken
+ "&type=" + type;
HttpClient httpClient = HttpClients.createDefault();
File file = new File("riven.jpg");
if (file 
== null || !file.exists()) { throw new FileNotFoundException(); } MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); multipartEntityBuilder .addBinaryBody("media", file) .setMode(HttpMultipartMode.RFC6532); HttpPost httpPost = new HttpPost(postUrl); httpPost.setEntity(multipartEntityBuilder
.build()); httpPost.setHeader("Content-Type", ContentType.MULTIPART_FORM_DATA.toString()); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); String content = EntityUtils.toString(httpEntity); System.out.println(content);

其中,之前版本的MultipartEntity也過時了,HttpClient4.5採用了MultipartEntityBuilder方法,可以看到“Fluent”的影子.

為了加深對Multipart/form-data的瞭解,放上一個連結:

現在就是缺少了非同步的方式,如果找到了非同步請求的方法,我再貼到這裡補充。