Java 如何使用ApacheHttpComponentST创建和发布多部分/混合http请求?

Java 如何使用ApacheHttpComponentST创建和发布多部分/混合http请求?,java,curl,http-post,apache-httpcomponents,Java,Curl,Http Post,Apache Httpcomponents,我使用的是ApacheHttpComponents v4.3.3(maven httpclient和HttpTime)。我需要上传一个带有元数据的文件。curl命令可以正常工作,如下所示 HttpEntity entity = MultiPartEntityBuilder .create() .addPart("field1",new StringBody("val1",ContentType.TEXT_PLAIN)) .addPart("field2",new StringBody("v

我使用的是ApacheHttpComponents v4.3.3(maven httpclient和HttpTime)。我需要上传一个带有元数据的文件。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");
curl-k-i-H“内容类型:多部分/混合”-X POST--form'field1=val1'--form'field2=val2'--form'file=@somefile.zip;类型=应用程序/zip'

我试着模仿这个卷曲的柱子如下

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:请求被拒绝,因为找不到多部分边界

当我向curl添加轨迹时

curl--trace--k-i-H“内容类型:多部分/混合”-X POST--form'field1=val1'--form'field2=val2'--form'file=@somefile.zip;类型=应用程序/zip'

我看到表单字段/值对被设置为HTTP头

内容配置:表单数据;名称=字段1…值1


知道我做错了什么吗?非常感谢您的帮助。

为了让代码正常工作,我做了两件事

  • 不再使用addPart(…)
  • 不再设置内容类型标题
下面是修改后的代码片段,以防有人感兴趣

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设置为调试模式

-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 -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 事实证明,每个部分现在都有一个边界。更好的是,内容类型和边界是自动生成的

内容类型:多部分/表单数据;边界=5ejpAjQxWK2n_3IVZagQ1U0_J_X9MdGvst9n2Tc


这里我的完整代码基于上一个响应,但略有不同,我有相同的错误,但现在可以工作了(谢谢Jane!):


不知道为什么你没有得到任何投票-这是Android上多部分的解决方案!我发现的其他东西都是手工完成的,这相当麻烦……但这不是多部分/混合的。关于如何使用multipart/form-data,似乎有数百个答案。欢迎使用堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。