2015-07-11 35 views

回答

1

SOAP和REST类型的Web服务只是标准。它们描述了SOAP/Rest Web服务应该如何。例如,SOAP Web服务调用以Envelope开头,并且可以具有(Soap)Header和(Saop)Body。此外,SOAP服务调用默认使用POST http方法。欲了解更多详情,请查询SOAP specificationRESTful web services

所以,JAVA communutiy还试图遵循这些规范。但是,只需将这些规范复制到java环境中,他们就可以将这些规范构建在这些规范之上。

让我尝试用一​​个例子来说明这一点,可以说你正在开发一个“你好,世界”的服务。你想使用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改变思维的角度去渣,你会不会定义你的对象作为XML,而不是你会用你的类。此外,您不会使用SOAPAction或任何其他xml标记定义您的方法。你只需在JAVA中编写你的方法。你需要一个框架来为你做出这些改变。否则,你最终会写出你的框架来使这种改变成为可能。此外,现在您可以使用一些注释将简单的POJO定义为SOAP(或Rest)服务。

因此,JAX-WS和JAX-RS仅仅处理SOAP和REST风格的服务架构的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,但实现完全不同。应用程序服务器也提供了自己的实现

但是自从SOAP规范强制它们之后,它们仍然需要将java对象转换为XML。还有一些将Java转换为Xml和XML转换为Java的库。如JAXBXStream。此外,当您开发其他服务时,您可能想将您的java对象转换为JSON。有一些工具也可用于此目的,如JacksonGSon

但是JAX-RS和JAX-WS并不是开发REST或SOAP Web服务的唯一方法。例如,为了开发REST风格的Web服务,您可以使用SpringMVC。 “那么,为什么我应该使用一个规范”,你可能会问。这完全取决于你使用规范与否。理论上,如果你使用规范,你可以随时改变你的实现。但是,由于每个不同的实现都提供了不同的酷炫功能,因此您可能会得到高度耦合的应用程序所以你可能不会轻易改变。

相关问题