java - 如何使用 Apache HttpComponentst 创建和发布多部分/混合 http 请求?

标签 java curl http-post apache-httpcomponents

我正在使用 Apache HttpComponents v4.3.3(maven httpclient 和 httpmime)。我需要上传一个包含一些元数据的文件。有效的 curl 命令如下所示。

curl -k -i -H "Content-Type: multipart/mixed" -X POST --form 'field1=val1' --form 'field2=val2' --form 'file=@somefile.zip;type=application/zip' https://www.some.domain/

我尝试如下模仿这个 curl 帖子。

HttpEntity entity = MultiPartEntityBuilder
 .create()
 .addPart("field1",new StringBody("val1",ContentType.TEXT_PLAIN))
 .addPart("field2",new StringBody("val2",ContentType.TEXT_PLAIN))
 .addPart("file", new FileBody(new File("somefile.zip"), ContentType.create("application/zip"))
 .build();
HttpPost post = new HttpPost("https://www.some.domain");
post.addHeader("Content-Type", "multipart/mixed");

但是,当我使用HttpClient 执行HttpPost 后,出现如下异常(服务器代码也是运行在Jetty 上的Java)。

org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

当我向 curl 添加跟踪时

curl --trace - -k -i -H "Content-Type: multipart/mixed" -X POST --form 'field1=val1' --form 'field2=val2' --form 'file=@somefile.zip;type=application/zip' https://www.some.domain/

我看到表单字段/值对设置为 HTTP header 。

Content-Disposition: form-data; name=field1...value1

知道我在这里做错了什么吗?感谢您的帮助。

最佳答案

我做了一些修改并做了两件事来让代码正常工作。

  • 不再使用 addPart(...)
  • 不再设置 Content-Type header

这是修改后的代码片段,以防有人感兴趣。

HttpEntity entity = MultipartEntityBuilder
 .create()
 .addTextBody("field1","val1")
 .addTextBody("field2","val2")
 .addBinaryBody("file", new File("somefile.zip"),ContentType.create("application/zip"),"somefile.zip")
 .build();
HttpPost post = new HttpPost("https://www.some.domain");
post.setEntity(entity);

我还将 HttpComponents 设置为 Debug模式。

-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
-Dorg.apache.commons.logging.simplelog.showdatetime=true
-Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG

事实证明,每个部分现在都有一个边界。更好的是,Content-Type 和边界是自动生成的。

Content-Type: multipart/form-data; boundary=5ejxpaJqXwk2n_3IVZagQ1U0_J_X9MdGvst9n2Tc

关于java - 如何使用 Apache HttpComponentst 创建和发布多部分/混合 http 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218785/

相关文章:

java - if/else if 内部 getter/setter Java

http post请求期间的Android :'Force Close'错误

android - 在 Android HTTP 请求中发送 utf-8 编码的字符串

c# - HTTP POST 返回错误 : 417 "Expectation Failed."

Java8 Streams - 如何将内部映射的键值从 "null"字符串修改为空对象

C++ .dll 的 Java 等价物?

iOS 在 UIView 上使用部分页面 curl ,而不是 UIViewController

php - 使用 HTTP-AUTH 重定向?

php - 发送带有自定义 header PHP 的 GET HTTPS 请求

java - Android编程——ListView中的多行EditText