如何在 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 HttpClient 9.3.6.v20151106 的代理 HTTP/2 Apple APN 连接