HTTP2上基于Java SOAP的WebService端点

时间:2015-12-09 22:57:09

标签: java web-services soap http2

是否有可能在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的Web服务非常不同(它们基于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的Web服务的HTTP传输被埋没在Java API的内部,并且在java 9之前不能切换到HTTP2(或者至少我不知道如何做到这一点)?< / p>

我错过了什么吗?如果您有任何想法请求分享。

由于

1 个答案:

答案 0 :(得分:0)

要使服务器端提供http / 2端点,您需要一台支持http / 2的服务器(jetty或者从2017年4月起支持它)。

此外,必须将服务器配置为提供https,即您必须添加ssl / tls-certificate。因此,您创建一个包含服务器证书的Java密钥库。

虽然http / 2不是必须的https工作,但大多数客户端都要求加密连接。此外,在使用jetty或者下载等服务器时,必须添加alpn-jar添加对alpn(应用层协议协商)的支持。

如果您使用Spring Boot和Undertow作为服务器,则可以这样配置:

@Bean
UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
    factory.addBuilderCustomizers(
            builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));
    return factory;
}

这应该添加到你的application.properties:

server.port=8443
server.ssl.key-store=classpath:sample.jks
server.ssl.key-store-password=secret
server.ssl.key-password=password

启动服务器时,必须将ALPN-jar添加到引导类路径中:

-Xbootclasspath/p:/home/user_x/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/8.1.8.v20160420/alpn-boot-8.1.8.v20160420.jar

您的http / 2客户端必须信任服务器的证书。如果您为服务器创建了自签名证书,则必须将其公钥添加到客户端的jvm信任存储中:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
-storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt

这个答案的灵感来自这篇博文:https://vanwilgenburg.wordpress.com/2016/04/01/spring-boot-http2/