java - 如何使用 JDK 11 java.net.http.HttpClient 上传文件?
问题描述
最近遇到JDK 11自带的java.net.http.HttpClient的一些问题,不知道怎么用文件上传。在 java.net.http.BodyPublishers 中找到了 ofInputStream()。我不知道我是否使用这种方法文件上传。以下是我写的例子。
public HttpResponse<String> post(String url, Supplier<? extends InputStream> streamSupplier, String... headers) throws IOException, InterruptedException {
HttpRequest.Builder builder = HttpRequest.newBuilder()
.uri(URI.create(url))
.headers(headers)
.POST(null == streamSupplier ?
HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofInputStream(streamSupplier));
HttpRequest request = builder.build();
log.debug("Execute HttpClient Method:『{}』, Url:『{}』", request.method(), request.uri().toString());
return client.send(request, HttpResponse.BodyHandlers.ofString());
}
解决方案
通过原始正文数据提供的java.net.http.HttpClient
句柄字节BodyPublisher
,没有任何解释。无论您使用HttpRequest.BodyPublishers::ofFile(Path)
还是HttpRequest.BodyPublishers::ofByteArray(byte[])
因此在语义上无关:改变的只是如何获得将要传输的字节。在文件上传的情况下 - 您的服务器可能希望请求正文将以某些方式格式化。它还可能期望一些特定的标头与请求一起传输(例如Content-Type
等)。HttpClient
不会为您神奇地做到这一点。这是您需要在调用者级别实现的东西。
推荐阅读
- r - 倾向得分与个人权重匹配
- javascript - 流星破坏子模板
- c - C realloc:下一个大小无效,aSan 说 heap-use-after-free
- java - IBM MQ 会话断开连接
- oracle-sqldeveloper - 如何确定表的空逻辑数据块
- r - rockchalk 包中的警告信息
- javascript - 在将部署的合约地址传递给另一个合约构造函数时卡住了
- swift - 如何解决 SpriteKit SKTexture 的 CGImage “上下文泄漏”?
- javascript - 如何检查消息的作者是否是 Discord 机器人?
- sql - Hive SQL 交叉连接问题的条件