【发布时间】:2015-09-30 05:53:31
【问题描述】:
Jax-ws(用于 XML 网络服务的 Java API) ---- 是一组用于创建 xml 格式的 web 服务的 API。 jax-rs(用于开发者轻松开发其余 Web 应用程序的 Java API)
我试图了解这个 api 的确切用途。
请帮助我理解这个概念。
【问题讨论】:
Jax-ws(用于 XML 网络服务的 Java API) ---- 是一组用于创建 xml 格式的 web 服务的 API。 jax-rs(用于开发者轻松开发其余 Web 应用程序的 Java API)
我试图了解这个 api 的确切用途。
请帮助我理解这个概念。
【问题讨论】:
SOAP 和 Restfull Web 服务只是标准。它们描述了 SOAP/Rest Web 服务应该是怎样的。例如,一个 SOAP Web 服务调用以一个 Envelope 开头,并且可以有一个 (Soap) Header 和 (Saop) Body。此外,SOAP 服务调用默认使用 POST http 方法。更多详情请查看SOAP specification和RESTful web services。
因此,java 社区也尝试遵循这些规范。但是,他们只是将这些规范复制到 java 环境中,而是在这些规范之上构建了他们的 api。
让我试着用一个例子来解释一下,假设你正在开发一个“Hello, World”服务。您想使用 SOAP 作为您的服务架构。完成服务设计后,您可能会编写自己的 WSDL 文档(在 SOAP 规范中)。在 WSDL 文档中,您使用 XML 定义您的对象,并使用 SOAPAction 和操作标记定义您的服务方法。像这样。
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://helloworld.bahadirakin.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="HelloWorldServiceService" targetNamespace="http://helloworld.bahadirakin.com/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://helloworld.bahadirakin.com/" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://helloworld.bahadirakin.com/">
<xs:complexType name="helloRequest">
<xs:sequence>
<xs:element minOccurs="0" name="firstName" type="xs:string"/>
<xs:element minOccurs="0" name="lastName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="helloRequest" nillable="true" type="helloRequest"/>
<xs:element name="sayHelloResponse" nillable="true" type="xs:string"/>
</xs:schema>
</wsdl:types>
<wsdl:message name="sayHelloResponse">
<wsdl:part element="tns:sayHelloResponse" name="sayHelloResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="sayHello">
<wsdl:part element="tns:helloRequest" name="helloRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="HelloWorldService">
<wsdl:operation name="sayHello">
<wsdl:input message="tns:sayHello" name="sayHello">
</wsdl:input>
<wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HelloWorldServiceServiceSoapBinding" type="tns:HelloWorldService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHello">
<soap:operation soapAction="sayHello" style="document"/>
<wsdl:input name="sayHello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloWorldServiceService">
<wsdl:port binding="tns:HelloWorldServiceServiceSoapBinding" name="HelloWorldServicePort">
<soap:address location="http://localhost:8080/camel-soap/HelloWorldInternal"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
在这个例子中,我们定义了一个服务,它包含一个名为sayHello 的方法,该方法获取helloRequest 类型的参数并返回sayHelloResponse 类型的参数。让我们看看我们定义为sayHelloResponse
<xs:element name="sayHelloResponse" nillable="true" type="xs:string"/>
它只是一个字符串,使用 XML 定义。
但是,当您将视角从 XML 更改为 JAVA 时,您不会将对象定义为 XML,而是使用您的类。此外,您不会使用 SOAPAction 或任何其他 xml 标记来定义您的方法。您只需在 JAVA 中编写您的方法。您将需要一个框架来为您进行此类更改。否则,您最终将编写框架以使这些更改成为可能。而且,现在您可以将简单的 POJO 定义为 SOAP(或 Rest)服务,只需一些注释。
因此,JAX-WS 和 JAX-RS 只是用于处理 SOAP 和 Restful Service 架构的 java 标准 (api) 的名称。通过使用这些框架,您将永远不用担心如何将 Java 方法更改为 Web 服务方法。这是上面给出的 WSDL 的 JAX-WS 版本。首先看一下我们的请求参数helloRequest。
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "helloRequest", propOrder = {
"firstName",
"lastName"
})
public class HelloRequest {
protected String firstName;
protected String lastName;
// GETTERS & SETTERS
}
如您所见,它只是一个 POJO。现在让我们看看我们的服务接口。
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
@WebService(targetNamespace = "http://helloworld.bahadirakin.com/", name = "HelloWorldService")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface HelloWorldService {
@WebResult(name = "sayHelloResponse", targetNamespace = "http://helloworld.bahadirakin.com/", partName = "sayHelloResponse")
@WebMethod
public java.lang.String sayHello(
@WebParam(partName = "helloRequest", name = "helloRequest", targetNamespace = "http://helloworld.bahadirakin.com/")
HelloRequest helloRequest
);
}
如您所见,没有信封、没有正文、没有 HTTP POST 或其他任何东西。您只需编写一个 java 接口并使用 JAX-WS API 将它们与 SOAP 匹配。是的,您仍然需要对什么是 SOAP 有一个基本的了解。但是借助 JAX-WS api,您可以轻松开发 SOAP Web 服务。
由于 JAX-WS 和 JAX-RS 只是 API,每个 api 都有不同的实现。例如,对于 JAX-WS,有 metro、cxf、Axis2 实现。对于 JAX-RS,有 jersey、cxf 等实现。他们使用相同的 API,但实现完全不同。应用服务器也提供它们自己的实现。
但是他们仍然需要将 java 对象转换为 XML,因为 SOAP 规范强制它。还有一些其他库可以将 Java 转换为 Xml 并将 XML 转换为 java。比如JAXB和XStream。此外,当您开发休息服务时,您可能希望将您的 java 对象转换为 JSON。也有一些用于此目的的工具,例如 Jackson 或 GSon。
但 JAX-RS 和 JAX-WS 并不是开发 REST 或 SOAP Web 服务的唯一方法。例如,为了开发 RESTful Web 服务,您可以使用 SpringMVC。
“那么,我为什么要使用规范”你可能会问。是否使用规范完全取决于您。从理论上讲,如果您使用规范,您可以随时更改您的实现。但是,由于每个不同的实现都提供了不同的酷特性,您最终可能会得到一个高度耦合的应用程序。所以你可能不会轻易改变。
【讨论】: