【发布时间】:2016-03-15 10:08:49
【问题描述】:
是否可以在 java 9 发布之前编写基于 SOAP 的 WebService 和客户端通过 HTTP2 进行通信?
如果是,我应该如何完成这项任务?
背景。最近我阅读并观看了一些关于 HTTP2 的很酷的东西。
文章: HTTP/2: A jump-start for Java developers
书籍章节: High Performance Browser Networking
还有视频:
unRESTful Web Services with HTTP2 by Fabian Stäber
Simone Bordet - HTTP 2.0 & Java: Current Status
简而言之,HTTP/2 更高效,解决了 HTTP/1.1 的问题,并且对 Web 应用程序是透明的(简化了它只是通过网络传输消息的不同表示)。
看起来您可以在使用 RESTful Web 服务时轻松切换到 HTTP2。 您需要在服务器端做的就是通过 Jetty(或其他支持 HTTP2 的容器)部署应用程序。
在客户端使用特殊的 Jetty HttpClient:
// Standard HTTP/1.1 client
new HttpClient();
// HTTP/2 transport client
new HttpClient(new HttpClientTransportOverHTTP2());
您可以通过 HTTP2 进行通信。
另一方面,基于 SOAP 的 WebServices 则完全不同(它们基于 JAX-WS API)。 您可以像这样定义服务器端端点:
@WebService
public class HelloWorld {
public String hello(String name) {
return "Hello " + name;
}
}
使用 java wsgen 生成一些代码,然后像这样运行它:
public class RunService {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/wsServerExample", new HelloWorld());
}
}
对于客户端,当您从 WSDL(使用 java wsimport)生成代码时,您可以像这样调用此服务:
public class WsClient {
public static void main(String args[]) {
HelloWorldService shs = new HelloWorldService();
HelloWorld sh = shs.getHelloWorldPort();
((BindingProvider) sh).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/wsServerExample");
System.out.println(sh.hello("bary"));
}
}
对于服务器,您可以通过更改属性 com.sun.net.httpserver.HttpServerProvider 来提供 HttpServer 的不同实现,例如:
System.setProperty("com.sun.net.httpserver.HttpServerProvider", "org.eclipse.jetty.http.spi.JettyHttpServerProvider");
但这不会为您提供 HTTP2 传输(对吗?)。
所以在我看来,这种基于 SOAP 的 WebServices 的 HTTP 传输被深埋在 java API 内部,在 java 9 之前无法切换到 HTTP2(或者至少我不知道如何做到这一点)?
我错过了什么吗?如果您有任何想法,请分享。
谢谢
【问题讨论】:
标签: java web-services soap http2