JDK 9 里的 JDK HTTP Client 的写法

2018-01-20 19:09:03 +08:00
 Livid

来自 https://blogs.oracle.com/java/jdk-http-client

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://openjdk.java.net/"))
      .build();
client.sendAsync(request, asString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

还可以指定使用 HTTP/2:

HttpClient client = HttpClient.newBuilder()
      .version(Version.HTTP_2)
      .followRedirects(Redirect.SAME_PROTOCOL)
      .proxy(ProxySelector.of(new InetSocketAddress("www-proxy.com", 8080)))
      .authenticator(Authenticator.getDefault())
      .build();
7391 次点击
所在节点    Java
38 条回复
bombless
2018-01-21 21:38:03 +08:00
@winglight2016 貌似是 java8 用来引用方法的,因为点号用来引用成员变量
qinxi
2018-01-21 22:07:13 +08:00
https://github.com/OpenFeign/feign/ 没人用这个嘛? 我感觉贼好用啊
qinxi
2018-01-21 22:12:24 +08:00
@winglight2016 对象的引用用 . ,lambda 带了类型推断, 所以可以少声明一个变量
(HttpResponse::body) 扩展出来就是(response->response.body())
(System.out::println) 就是 str->System.out.println(str) 这个跟上面不一样的地方就是 str 作为参数自动填充了
paragon
2018-01-22 10:03:07 +08:00
这个看上去和 okhttp 一样啊……
hantsy
2018-01-22 11:51:21 +08:00
@winglight2016 你应该不懂 Java 吧
hantsy
2018-01-22 11:57:16 +08:00
@Livid `thenApply`, `thenAccept` 类似 Reactive Stream,Java8 中已经有 CompeteableFuture 支持这些。

但 Java 9 已经集成了 Reactive Streams API (直接 Copy 了 ReactiveStreams 规范中的接口到 Flow 接口中),为什么不直接使用 Flow 去实现呢?
hantsy
2018-01-22 11:58:50 +08:00
Spring 5 中的 WebFlux 深度集成了 Reactor,Reactor 也是 Reactive Stream 的一个实现。
winglight2016
2018-01-22 12:08:38 +08:00
@qinxi 明白了,所以 java 的 lambda 都是形式化了,并不是一种进化,也难怪很少人这么用
hantsy
2018-01-22 12:17:29 +08:00
@Livid HttpRequest 里面的 BodyPublisher 是用了新的 Flow.Publisher 接口。。。但 sendAsync 依然是返回 CompleteableFuture.

这个 HttpClient 在 Java 9 还是孵化状态,Java 10 应该会变成稳定可用。
hantsy
2018-01-22 12:33:55 +08:00
@mikulch RestTemplate 慢慢过时了,Spring 5 推荐使用新的 WebClient。
hantsy
2018-01-22 12:38:58 +08:00
突然想起 Java EE 8 中 Jaxrs 2.1 的新特性之一,其 Client API 也开始支持 Reactive Streams,除了 Java 8 的 CompleteableFuture, 还支持 RxJava,RxJava2 和 Guava LisentableFuture。

WebTarget target = ClientBuilder.newClient().target("http://localhost:8080/jaxrs-async/rest/ejb");

CompletionStage<Void> future = target.request()
.rx()
.get(String.class)
.thenAccept(t -> System.out.println(t));


参见: https://github.com/hantsy/javaee8-by-example-gitbook/blob/master/jaxrs-client.md
hantsy
2018-01-22 12:48:24 +08:00
@qinxi Spring Cloud/Netflix OSS 一直有用到,不过不感觉这是什么新方法。接口上加注释自动简化处理请求,这在 JBoss RESTeasy 好多年前就用过了。
hantsy
2018-01-22 12:55:45 +08:00
@paragon OkHttp 相对 Java 9 这个从 API 设计上差太远了。OkHttp 异步依然是用老式的 Runnable,Callback 支持。根本没更新到最新 Future(CompleteableFuture ), 官方好像也不支持 Reactive Streams。
qinxi
2018-01-22 13:20:41 +08:00
@winglight2016 很少人用是因为培训班不教
hantsy
2018-01-22 13:26:41 +08:00
@paragon OKHTTP 应该是 API 没更新到 Java8, 还是为 Java 7 设计的。
paragon
2018-01-22 14:22:26 +08:00
@hantsy 传教也要遵守基本法啊 异步调用最初的时候就有 非要 Reactive 支持直接 rxJava 啊~ 现在的人用个语法糖就觉得牛 X 了 Naive~
winglight2016
2018-01-22 14:42:02 +08:00
@qinxi 这种写法代码可读性也不高啊,要先翻译一下才能理解,还不如多写几行代码,反正 java 已经是这样了。。。不算是不思进取吧
hantsy
2018-01-22 17:34:20 +08:00
@paragon 你牛 X

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/424563

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX