JAX-WS(XML的Web服务的Java API) ----是XML格式创建一个web服务一组API。 jax-rs(java API用于开发人员轻松开发其他Web应用程序)在SOAP中使用Restfull Webservices和JAX-WS时如何使用Jax-RS?
我想了解这个api的使用方式。
请帮我理解这个概念。
JAX-WS(XML的Web服务的Java API) ----是XML格式创建一个web服务一组API。 jax-rs(java API用于开发人员轻松开发其他Web应用程序)在SOAP中使用Restfull Webservices和JAX-WS时如何使用Jax-RS?
我想了解这个api的使用方式。
请帮我理解这个概念。
SOAP和REST类型的Web服务只是标准。它们描述了SOAP/Rest Web服务应该如何。例如,SOAP Web服务调用以Envelope开头,并且可以具有(Soap)Header和(Saop)Body。此外,SOAP服务调用默认使用POST http方法。欲了解更多详情,请查询SOAP specification和RESTful 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的库。如JAXB和XStream。此外,当您开发其他服务时,您可能想将您的java对象转换为JSON。有一些工具也可用于此目的,如Jackson或GSon。
但是JAX-RS和JAX-WS并不是开发REST或SOAP Web服务的唯一方法。例如,为了开发REST风格的Web服务,您可以使用SpringMVC。 “那么,为什么我应该使用一个规范”,你可能会问。这完全取决于你使用规范与否。理论上,如果你使用规范,你可以随时改变你的实现。但是,由于每个不同的实现都提供了不同的酷炫功能,因此您可能会得到高度耦合的应用程序所以你可能不会轻易改变。