Java HttpClient 3.1 多部分 Post
Java HttpClient 3.1 Multipart Post
我正在使用 Java HttpClient 3.1 为 REST API 调用编码。我 运行 遇到 Post 和 multipart/form-data
的问题。这是我尝试拨打的 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-data
设置为 postMethod.addRequestHeader("Content-Type", "multipart/form-data");
我是不是漏掉了什么?
我想出了解决办法。这是修复:
parts[2] = new FilePart("documentImage", f, "image/png", null);
它所做的是为 FilePart 设置 CONTENT_TYPE
。 DEFAULT_CONTENT_TYPE
如果未在构造函数中设置,则为 application/octet-stream
。
我使用的构造方法是:
public FilePart(String name,
PartSource partSource,
String contentType,
String charset)
我正在使用 Java HttpClient 3.1 为 REST API 调用编码。我 运行 遇到 Post 和 multipart/form-data
的问题。这是我尝试拨打的 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-data
设置为 postMethod.addRequestHeader("Content-Type", "multipart/form-data");
我是不是漏掉了什么?
我想出了解决办法。这是修复:
parts[2] = new FilePart("documentImage", f, "image/png", null);
它所做的是为 FilePart 设置 CONTENT_TYPE
。 DEFAULT_CONTENT_TYPE
如果未在构造函数中设置,则为 application/octet-stream
。
我使用的构造方法是:
public FilePart(String name,
PartSource partSource,
String contentType,
String charset)