如何在 Jetty HttpClient 中进行多部分/表单数据发布

Posted

技术标签:

【中文标题】如何在 Jetty HttpClient 中进行多部分/表单数据发布【英文标题】:How to do multipart/form-data post in Jetty HttpClient 【发布时间】:2011-08-31 10:13:44 【问题描述】:

我想知道是否有人可以帮助我。 对于 Java 项目,我想使用 Jetty HttpClient 将数据发送到 Restful Web 服务。 有几个问题:

    Jetty 客户端是否支持多部分/表单数据发布? 从 Jetty 文档,要发送任何数据,您需要使用 HttpExchange.setRequestContent(Buffer) 或 HttpExchangge.setRequestContentSource(InputStream) 方法指定请求内容。如果我使用 setRequestContentSource 进行文件上传,如何为多部分帖子设置额外的表单参数,例如文件名?

    有没有办法使用 Jetty 客户端检查上传进度?我需要一个标准的东西,比如显示字节发送、% 等的进度条 Jetty 提供了大量的回调,如 onResponseContent、onResponseStatus、onRequestCommitted,但没有一个可以帮助监控已发送的字节数。是否可以使用 Jetty httpclient 获取上传进度?

提前谢谢你

【问题讨论】:

【参考方案1】:

您必须使用 MultiPartContentProvider

发件人:http://download.eclipse.org/jetty/9.3.9.v20160517/apidocs/org/eclipse/jetty/client/util/MultiPartContentProvider.html

内容类型为“multipart/form-data”的表单上传的 ContentProvider。

示例用法:

 MultiPartContentProvider multiPart = new MultiPartContentProvider();
 multiPart.addFieldPart("field", new StringContentProvider("foo"), null);
 multiPart.addFilePart("icon", "img.png", new PathContentProvider(Paths.get("/tmp/img.png")), null);
 multiPart.close();
 ContentResponse response = client.newRequest("localhost", connector.getLocalPort())
     .method(HttpMethod.POST)
     .content(multiPart)
     .send();

上面的例子相当于提交这个表单:

 <form method="POST" enctype="multipart/form-data"  accept-charset="UTF-8">
     <input type="text" name="field" value="foo" />
     <input type="file" name="icon" />
 </form>

【讨论】:

【参考方案2】:

使用 Apache Http 客户端 4.x 会对您有所帮助。 请参见: http://hc.apache.org/httpcomponents-client-ga/examples.html

【讨论】:

以上是关于如何在 Jetty HttpClient 中进行多部分/表单数据发布的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jetty 9 从 HttpClient 获取响应时出错

Jetty服务怎么配置,如何发布项目

与 Jetty HttpClient 9.3.6.v20151106 的代理 HTTP/2 Apple APN 连接

如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut

总结httpclient资源释放和连接复用

在maven多模块结构中,并且使用overlay的情况下使用jetty热部署