【问题标题】:How Jax-RS used in Restfull Webservices and JAX-WS used in SOAP ?如何在 Restful Web 服务中使用 Jax-RS 和在 SOAP 中使用 JAX-WS?
【发布时间】:2015-09-30 05:53:31
【问题描述】:

Jax-ws(用于 XML 网络服务的 Java API) ---- 是一组用于创建 xml 格式的 web 服务的 API。 jax-rs(用于开发者轻松开发其余 Web 应用程序的 Java API)

我试图了解这个 api 的确切用途。

请帮助我理解这个概念。

【问题讨论】:

    标签: rest jax-rs jax-ws


    【解决方案1】:

    SOAP 和 Restfull Web 服务只是标准。它们描述了 SOAP/Rest Web 服务应该是怎样的。例如,一个 SOAP Web 服务调用以一个 Envelope 开头,并且可以有一个 (Soap) Header 和 (Saop) Body。此外,SOAP 服务调用默认使用 POST http 方法。更多详情请查看SOAP specificationRESTful 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,有 metrocxfAxis2 实现。对于 JAX-RS,有 jerseycxf 等实现。他们使用相同的 API,但实现完全不同。应用服务器也提供它们自己的实现。

    但是他们仍然需要将 java 对象转换为 XML,因为 SOAP 规范强制它。还有一些其他库可以将 Java 转换为 Xml 并将 XML 转换为 java。比如JAXBXStream。此外,当您开发休息服务时,您可能希望将您的 java 对象转换为 JSON。也有一些用于此目的的工具,例如 JacksonGSon

    但 JAX-RS 和 JAX-WS 并不是开发 REST 或 SOAP Web 服务的唯一方法。例如,为了开发 RESTful Web 服务,您可以使用 SpringMVC

    “那么,我为什么要使用规范”你可能会问。是否使用规范完全取决于您。从理论上讲,如果您使用规范,您可以随时更改您的实现。但是,由于每个不同的实现都提供了不同的酷特性,您最终可能会得到一个高度耦合的应用程序。所以你可能不会轻易改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2023-04-10
      • 2013-04-24
      • 2011-09-09
      • 2010-10-16
      相关资源
      最近更新 更多