使用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();

  發現DefaultHttpClient過時了,參考:DefaultHttpClient()過時, 官網api查看

換成:

	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的瞭解,放上一個鏈接:Multipart/form-data上傳詳解


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章