jdk11HttpClient⽤法
jdk11 HttpClient ⽤法
前⼏天研究了Java的异步处理CompletableFuture,它是在1.8中新加的,jdk11中的HttpClient刚好也⽤到了,顺便说⼀下怎么使⽤,以前可能会⽤第三⽅的http处理库,现在Java11已经⾃带了,⽽且⽤起来也很⽅便。
java.http.HttpClient
这个类主要是⽤来发送http请求的,是⼀个抽象类,通过builder来创建实例。
HttpClient client = wBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(6))
.build();
builder⼏个常⽤的设置:
connectTimeout() 连接超时时间
cookieHandler() Cookie处理器
executor() ⽤于执⾏异步请求的执⾏程序
followRedirects() 重定向策略
proxy() 代理设置
version() http版本,⽀持http2
两个发送请求的⽅法:
同步请求
request:发送的请求
responseBodyHandler:响应结果处理器
HttpResponse:http响应
public abstract<T> HttpResponse<T>send(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)throws IOException, Interru ptedException
异步请求
request:发送的请求
responseBodyHandler:响应结果处理器
CompletableFuture<HttpResponse>:异步响应结果
public abstract<T> CompletableFuture<HttpResponse<T>>sendAsync(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
java.http.HttpRequest
包装要发送的请求,⽐如请求链接,请求⽅法,请求体,请求头等等。同样是⼀个抽象类,使⽤builder来构造实例。
HttpRequest request = wBuilder()
.version(HttpClient.Version.HTTP_1_1)
.method("GET", bodyPublisher)
.timeout(Duration.ofSeconds(2))
.ate(""))
.build();
builder⼏个常⽤的设置:
uri() 请求的uri
timeout() 请求超时时间,不设置则为⽆限
version() 请求⾸选的http版本,不设置则和HttpClient⼀样
header 设置请求头
headers() ⼀次是设置多个请求头,key,value,key,value…
method() 设置请求⽅法和请求体
HttpRequest.BodyPublisher
主要是将普通的Java请求对象转换为字节缓冲流作为请求体发送。为接⼝,其实现类为HttpRequest.BodyPublishers。将⼀些常见的Java对象转换为字节缓冲流。
⽆请求体noBody()
从字节数组创建 ofByteArray(byte[] buf)
从⽂件创建ofFile(Path path)
从输⼊流创建ofInputStream(Supplier<? extends InputStream> streamSupplier)
从字符串创建ofString(String s, Charset charset)
// Request body from a String
HttpRequest request = wBuilder()
.ate("foo/"))
.header("Content-Type","text/plain; charset=UTF-8")
.POST(BodyPublishers.ofString("some body text"))
.build();
// Request body from a File
HttpRequest request = wBuilder()
.ate("foo/"))
.header("Content-Type","application/json")
.POST(BodyPublishers.("file.json")))
.build();
// Request body from a byte array
HttpRequest request = wBuilder()
.ate("foo/"))
.POST(BodyPublishers.ofByteArray(new byte[]{...}))
.build();
java.http.HttpResponse
http响应,不能直接创建,当发送请求之后作为结果返回。当响应状态码和标头接收到时,响应才可⽤。
接受字符串响应体:
HttpResponse<String> response = client
jdk怎么使用
.send(request, BodyHandlers.ofString());
HttpResponse.BodyHandler
响应体处理器,将字节转为Java对象。为接⼝,实现类为HttpResponse.BodyHandlers。
BodyHandlers.ofString(),将响应体作为字符串接收
BodyHandlers.ofFile(),将响应体作为⽂件接收
BodyHandlers.ofInputStream(),将响应体作为输⼊流
BodyHandlers.discarding(),丢弃响应体
java.CookieHandler
Java1.5,抽象类,进⾏Cookie处理。⼦类为CookieManager,默认是将Cookie存储与内存中。
基本使⽤流程:
1. 创建HttpClient
client = wBuilder()
.version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.ofSeconds(2))
.
cookieHandler(new CookieManager())
.build();
2. 创建HttpRequest
HttpRequest.BodyPublisher publisher = HttpRequest.BodyPublishers.ofString(body);
request = wBuilder()
.version(HttpClient.Version.HTTP_1_1)
.headers("Content-type","application/x-www-form-urlencoded")
.method("POST", publisher)
.timeout(Duration.ofSeconds(2))
.ate(HOST + url))
.build();
3. 发送请求,接收响应
同步:
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
response.statusCode();响应码
response.body();响应体
异步:
CompletableFuture<HttpResponse<String>> response = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
response.thenApply(response -> response.body())
.thenAccept(body ->{
System.out.println(body);
});

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。