- java.lang.Object
-
- jdk.incubator.http.HttpRequest
-
public abstract class HttpRequest extends Object
表示可以发送到服务器的一个HTTP请求。
Incubating Feature.将在以后的版本中删除。HttpRequest
是从HttpRequest
builder
s。HttpRequest
通过致电HttpRequest.newBuilder
获得建设者。 一个请求的URI
,头和身都可以设置。 请求体通过提供HttpRequest.BodyProcessor
供给到对象DELETE
,POST
或PUT
方法。GET
不用身体。 一旦所有必需的参数都在构建器设置,HttpRequest.Builder.build()
被称为返回HttpRequest
。 建筑商也可以多次复制和修改,以构建一些参数不同的多个相关请求。两个简单的示例HTTP交互如下所示:
HttpClient client = HttpClient.newHttpClient(); // GET HttpResponse<String> response = client.send( HttpRequest .newBuilder(new URI("http://www.foo.com/")) .headers("Foo", "foovalue", "Bar", "barvalue") .GET() .build(), BodyHandler.asString() ); int statusCode = response.statusCode(); String body = response.body(); // POST HttpResponse<Path> response = client.send( HttpRequest .newBuilder(new URI("http://www.foo.com/")) .headers("Foo", "foovalue", "Bar", "barvalue") .POST(BodyProcessor.fromString("Hello world")) .build(), BodyHandler.asFile(Paths.get("/path")) ); int statusCode = response.statusCode(); Path body = response.body(); // should be "/path"
发送请求,并通过在
HttpClient
中调用以下方法之一获得响应。-
HttpClient.send(HttpRequest, HttpResponse.BodyHandler)
块直至整个请求已发送和已接收到响应。 -
HttpClient.sendAsync(HttpRequest,HttpResponse.BodyHandler)
发送请求并异步接收响应。 立即返回CompletableFuture
<HttpResponse
>。 -
HttpClient.sendAsync(HttpRequest,HttpResponse.MultiProcessor)
异步发送请求,期望多个响应。 此功能与HTTP / 2服务器推送最相关,但也可用于单个响应(HTTP / 1.1或HTTP / 2)。
一旦接收到
HttpResponse
,标题,响应代码和主体(通常)都可用。 身体是否被读取取决于响应体的类型<T>
。 见下文。有关同步与异步使用的讨论,请参见下文。
请求机构
请求主体使用下列
HttpRequest.BodyProcessor
中提供的请求处理器实现之一发送 ,否则可以使用自定义实现。-
fromByteArray(byte[])
从字节数组 -
fromByteArrays(Iterable)
从一个字节数组的可迭代 -
fromFile(Path)
从位于给定路径的文件 -
fromString(String)
从一个字符串 - 从供应商获得的InputStream中的
fromInputStream
(Supplier
<InputStream
>) -
noBody()
没有请求机构发送
反应机构
回应机构在两个层面处理。 发送请求时,指定响应主体处理程序。 这是一个函数(
HttpResponse.BodyHandler
),一旦接收到这个函数,它将被响应状态代码和头部调用。 然后,该函数应该返回一个HttpResponse.BodyProcessor
<T>
,然后将其用于读取响应主体转换成T的一个实例在此之后,响应在变得可用HttpResponse
和HttpResponse.body()
然后可以被调用以获得身体。 有些实现两者的使用实例HttpResponse.BodyProcessor
和HttpResponse.BodyHandler
中提供HttpResponse
:一些预定义的身体处理程序
-
BodyHandler.asByteArray()
将主体存储在字节数组中 -
BodyHandler.asString()
将主体存储为字符串 -
BodyHandler.asFile(Path)
将主体存储在命名文件中 -
BodyHandler.discard()
丢弃响应正文并返回给定的值。
多重反应
使用HTTP / 2,服务器可以将主响应和零个或多个附加响应(称为服务器推送)发送到客户端发起的请求。 这些是使用一个叫做
HttpResponse.MultiProcessor
的特殊响应处理器处理的。阻塞/异步行为和线程使用
有两种请求发送方式: 同步和异步 。
HttpClient.send(HttpRequest, HttpResponse.BodyHandler)
阻塞调用线程,直到发送请求并收到响应。HttpClient.sendAsync(HttpRequest, HttpResponse.BodyHandler)
是异步的,并立即返回一个CompletableFuture
<HttpResponse
>,当该对象完成(在后台线程中)时,已收到响应。HttpClient.sendAsync(HttpRequest,HttpResponse.MultiProcessor)
是多响应的变体,也是异步的。CompletableFuture
可以以不同的方式组合,以声明几个异步任务之间的依赖关系,同时允许最大程度的并行性被利用。安全检查
如果存在安全管理员,则通过发送方法进行安全检查。 需要
URLPermission
或SocketPermission
才能访问所使用的任何目的地源服务器和代理服务器。URLPermission
S的关系的政策文件超过首选SocketPermission
给出的范围更有限小号URLPermission
。 权限总是隐含地授予系统的默认代理。 用于访问代理的URLPermission
表单使用方法参数为"CONNECT"
(用于各种代理)和一个形式为"socket://host:port"
的url字符串,其中host和port指定代理的地址。例子
HttpClient client = HttpClient .newBuilder() .build(); HttpRequest request = HttpRequest .newBuilder(new URI("http://www.foo.com/")) .POST(BodyProcessor.fromString("Hello world")) .build(); HttpResponse<Path> response = client.send(request, BodyHandler.asFile(Paths.get("/path"))); Path body = response.body();
异步例子
上面的例子将异步工作,如果
(HttpRequest, HttpResponse.BodyHandler) sendAsync
来代替send
在这种情况下返回的对象是CompletableFuture
<HttpResponse>
代替HttpResponse
。 以下示例显示可以异步发送多个请求。 它还显示了如何使用CompletableFuture
中的许多方法之一轻松链接从属异步操作(接收响应和接收响应体)。// fetch a list of target URIs asynchronously and store them in Files. List<URI> targets = ... List<CompletableFuture<File>> futures = targets .stream() .map(target -> client .sendAsync( HttpRequest.newBuilder(target) .GET() .build(), BodyHandler.asFile(Paths.get("base", target.getPath()))) .thenApply(response -> response.body()) .thenApply(path -> path.toFile())) .collect(Collectors.toList()); // all async operations waited for here CompletableFuture.allOf(futures.toArray(new CompletableFuture<?>[0])) .join(); // all elements of futures have completed and can be examined. // Use File.exists() to check whether file was successfully downloaded
除非另有说明,否则
null
参数值将导致此类的方法抛出NullPointerException
。- 从以下版本开始:
- 9
-
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 描述 static interface
HttpRequest.BodyProcessor
将高级Java对象转换为适合作为请求体发送的ByteBuffer
的流的处理器 。static class
HttpRequest.Builder
一个HttpRequest
的建造者。
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
HttpRequest()
创建一个HttpRequest。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract Optional<HttpRequest.BodyProcessor>
bodyProcessor()
返回一个Optional
其中包含这个请求的HttpRequest.BodyProcessor
。abstract Duration
duration()
返回此请求的持续时间。abstract boolean
expectContinue()
返回此请求的expect continue
设置。abstract HttpHeaders
headers()
此请求(或将要)发送的(用户可访问的)请求标头。abstract String
method()
返回此请求的请求方法。static HttpRequest.Builder
newBuilder()
创建一个HttpRequest
器。static HttpRequest.Builder
newBuilder(URI uri)
创建一个HttpRequest
构建器。static HttpRequest.BodyProcessor
noBody()
请求体处理程序,不发送请求体。abstract URI
uri()
返回此请求的请求URI
。abstract Optional<HttpClient.Version>
version()
返回一个Optional
其中包含将要为此HttpRequest
请求的HTTP协议版本。
-
-
-
方法详细信息
-
newBuilder
public static HttpRequest.Builder newBuilder(URI uri)
创建一个HttpRequest
器。- 参数
-
uri
- 请求URI - 结果
- 一个新的请求生成器
- 异常
-
IllegalArgumentException
- 如果不支持URI方案。
-
newBuilder
public static HttpRequest.Builder newBuilder()
创建一个HttpRequest
构建器。- 结果
- 一个新的请求生成器
-
bodyProcessor
public abstract Optional<HttpRequest.BodyProcessor> bodyProcessor()
返回一个Optional
其中包含HttpRequest.BodyProcessor
这个请求。 如果在请求的构建器中没有设置BodyProcessor
,则Optional
为空。- 结果
-
一个
Optional
包含该请求的BodyProcessor
-
method
public abstract String method()
返回此请求的请求方法。 如果未明确设置,任何请求的默认方法为“GET”。- 结果
- 这个请求的方法
-
duration
public abstract Duration duration()
返回此请求的持续时间。- 结果
- 这要求持续时间
-
expectContinue
public abstract boolean expectContinue()
返回此请求的expect continue
设置。- 结果
- 此请求期望继续设置
-
uri
public abstract URI uri()
返回此请求的请求URI
。- 结果
- 这个请求的URI
-
version
public abstract Optional<HttpClient.Version> version()
返回一个Optional
其中包含将要为此HttpRequest
请求的HTTP协议版本。 如果请求的构建器中未设置版本,则Optional
为空。 在这种情况下,请求的版本将是发送HttpClient
的版本 。 应查询相应的HttpResponse
以确定实际使用的版本。- 结果
- HTTP协议版本
-
headers
public abstract HttpHeaders headers()
此请求(或将要)发送的(用户可访问的)请求标头。- 结果
- 这个请求的HttpHeaders
-
noBody
public static HttpRequest.BodyProcessor noBody()
请求体处理程序,不发送请求体。- 结果
- 一个BodyProcessor
-
-