簡體   English   中英

Java HttpClient 3.1 Multipart Post

[英]Java HttpClient 3.1 Multipart Post

我正在使用Java HttpClient 3.1來編寫REST API調用的代碼。 我遇到了具有multipart/form-data Post問題。 這是我想要進行的API調用,以API提供者為例:

POST /v1/documents HTTP/1.1
Host: .......
x-session-key: 02e57c7d-d071-4c63-b491-1194a9939ea5.2016-01-13T22:34:53.101Z
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="documentImage"; filename="ScreenShot 2016-01-14 at 1.48.48 PM.png"
Content-Type: image/png


----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="documentType"

Picture ID
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="token"

02e57c7d-d071-4c63-b491-1194a9939ea5
----WebKitFormBoundary7MA4YWxkTrZu0gW

這是我的HttpClient 3.1代碼:

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;


Part[] parts = new Part[3];
parts[0] = new StringPart("token", this.user.userID);
parts[1] = new StringPart("documentType", "Picture ID");

try {
    File imageFile = new File("/path/test2.png");
    parts[2] = new FilePart("documentImage", imageFile);
} catch (FileNotFoundException ex) {
    .....
}

PostMethod postMethod = new PostMethod(hostURL + "/documents");

MultipartRequestEntity entity = new MultipartRequestEntity(parts, postMethod.getParams());
postMethod.setRequestEntity(entity);

postMethod.addRequestHeader("Content-Type", "multipart/form-data");
postMethod.addRequestHeader("x-session-key", "sjkkjksjkkjdjk");

HttpClient httpClient = new HttpClient();
int statusCode = 0;
try {
    statusCode = httpClient.executeMethod(httpMethod);
} catch (IOException ex) {
    ....
}

String respond = null;
try {
    StringBuilder resultStr = new StringBuilder();
    try (BufferedReader rd = new BufferedReader(new InputStreamReader(httpMethod.getResponseBodyAsStream()))) {
        String line;
        while ((line = rd.readLine()) != null) {
            resultStr.append(line);
        }
    }
    respond = resultStr.toString();
    httpMethod.releaseConnection();
} catch (IOException ex) {
    .....
}

System.out.println("status code: " + statusCode + ", respond: " + respond);

我從API服務器得到的回復是:

status code: 400, respond: {"code":400,"message":"Unknown content type [contentType=application/octet-stream]"}

我已經設置multipart/form-datapostMethod.addRequestHeader("Content-Type", "multipart/form-data");

我錯過了什么嗎?

我找到了解決方案。 這是修復:

parts[2] = new FilePart("documentImage", f, "image/png", null);

它的作用是為FilePart設置CONTENT_TYPE 如果未在構造函數中設置,則DEFAULT_CONTENT_TYPEapplication/octet-stream

我使用的構造方法是:

public FilePart(String name,
            PartSource partSource,
            String contentType,
            String charset)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM