[英]Java equivalent of curl post request with image and text
我正在嘗試編寫Java代碼來完全執行此命令的作用:
curl -F "image=@image.jpg" -F "param1=some-value" -F "param2=some_value" http://example.com
我目前正在嘗試這樣的事情:
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost poster = new HttpPost("http://example.com");
MultipartEntityBuilder mpEntityBuilder = MultipartEntityBuilder.create();
mpEntityBuilder.addPart("param1", new StringBody("some-value"));
mpEntityBuilder.addPart("param2", new StringBody("some-value"));
mpEntity.addPart("image", getImage("some-image"));
poster.setEntity(mpEntityBuilder .build());
HttpResponse response = httpClient.execute(poster);
getImage(String)返回一個ByteArrayBody。 (我實際上是在網上即時下載圖像,而不是像curl命令一樣從磁盤讀取圖像,但是我認為這不會有所作為)
我檢查了此鏈接,但它不能完全解決您同時發送圖像和文本參數的情況: Java等同於curl查詢
奇怪的是,我使用幾乎相同的代碼將HTTP發布到另一個API,當我需要單獨發送不帶任何文本參數的圖像時,它可以正常工作。 (無弦體)
但是,當我嘗試同時發送圖像(作為ByteArrayBody)和一些文本(作為StringBody)時,我從服務器收到一條神秘的錯誤消息,內容如下:'無法使用mimeType初始化參數對象:application / octet -流'。 這可能是自定義錯誤消息,因此我實際上找不到太多信息。
我不建議使用StringBody()的其他一些構造函數,因為已棄用該構造函數,但它沒有幫助。 不確定使用什么正確的構造函數,但不確定是否會引起問題。
編輯:之前似乎有人問過一個非常類似的問題,但是該解決方案對我不起作用: Android:一起填寫POST正文上傳文件我收到有關mimeType參數初始化失敗的錯誤消息:application / octet-stream)
我沒有看到它的文檔,但是curl -F @
顯然試圖對某些擴展名/后綴(包括.jpg
image/jpeg
填充Content-type
有所幫助。 HttpClient不會,並且將所有內容默認設置為MIME“我不知道”,類型為application/octet-stream
,這可能會導致您的錯誤。 使用設置內容類型的3-arg ctor
new ByteArrayBody (data, ContentType.create("image/jpeg"), null)
或者,如果您要指定filename屬性,而curl -F @
也會這樣做,但是Web服務器(與瀏覽器不同) 通常並不在意,請提供String
代替第三個null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.