- java.lang.Object
-
- jdk.incubator.http.HttpRequest
-
public abstract class HttpRequest extends Object
表示可以发送到服务器的一个HTTP请求。
Incubating Feature.将在以后的版本中删除。HttpRequest是从HttpRequestbuilders。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才能访问所使用的任何目的地源服务器和代理服务器。URLPermissionS的关系的政策文件超过首选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 interfaceHttpRequest.BodyProcessor将高级Java对象转换为适合作为请求体发送的ByteBuffer的流的处理器 。static classHttpRequest.Builder一个HttpRequest的建造者。
-
构造方法摘要
构造方法 Modifier Constructor 描述 protectedHttpRequest()创建一个HttpRequest。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract Optional<HttpRequest.BodyProcessor>bodyProcessor()返回一个Optional其中包含这个请求的HttpRequest.BodyProcessor。abstract Durationduration()返回此请求的持续时间。abstract booleanexpectContinue()返回此请求的expect continue设置。abstract HttpHeadersheaders()此请求(或将要)发送的(用户可访问的)请求标头。abstract Stringmethod()返回此请求的请求方法。static HttpRequest.BuildernewBuilder()创建一个HttpRequest器。static HttpRequest.BuildernewBuilder(URI uri)创建一个HttpRequest构建器。static HttpRequest.BodyProcessornoBody()请求体处理程序,不发送请求体。abstract URIuri()返回此请求的请求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
-
-