Jax-RS如何在Restfull Web服务中使用,Jax-WS如何在SOAP中使用?

Jax-RS如何在Restfull Web服务中使用,Jax-WS如何在SOAP中使用?,rest,jax-rs,jax-ws,Rest,Jax Rs,Jax Ws,Jax ws(用于XML Web服务的Java API) ----是一组用于以xml格式创建Web服务的API。 jax rs(用于开发人员轻松开发rest web应用程序的java API) 我正试图了解这个api到底在哪里使用 请帮助我理解这个概念 SOAP和Restfull Web服务只是标准。它们描述了SOAP/Rest web服务应该是怎样的。例如,soapweb服务调用以信封开始,可以有(SOAP)头和(Saop)体。SOAP服务调用也使用POST http方法作为默认方法。有关更多

Jax ws(用于XML Web服务的Java API) ----是一组用于以xml格式创建Web服务的API。 jax rs(用于开发人员轻松开发rest web应用程序的java API)

我正试图了解这个api到底在哪里使用


请帮助我理解这个概念

SOAP和Restfull Web服务只是标准。它们描述了SOAP/Rest web服务应该是怎样的。例如,soapweb服务调用以信封开始,可以有(SOAP)头和(Saop)体。SOAP服务调用也使用POST http方法作为默认方法。有关更多详细信息,请查看和

因此,java Communiutiy也尝试遵循这些规范。但他们不是将这些规范复制到java环境中,而是在这些规范的基础上构建api

让我试着用一个例子来解释这一点,假设您正在开发一个“Hello,World”服务。您希望使用SOAP作为您的服务体系结构。当您完成服务设计时,您可能会编写自己的WSDL文档(在SOAP规范中)。在WSDL文档中,您可以使用XML定义对象,还可以使用SOAPAction和operation标记定义服务方法。像这样

<?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>
它只是一个字符串,使用XML定义

但是,当您将透视图从XML更改为JAVA时,您不会将对象定义为XML,而是使用类。此外,您不会使用SOAPAction或任何其他xml标记定义方法。您只需用JAVA编写方法。您将需要一个框架来为您进行此类更改。否则,您将最终编写框架以使此类更改成为可能。而且,现在您可以将简单的POJO定义为只需一些注释的SOAP(或Rest)服务

因此,JAX-WS和JAX-RS只是用于处理SOAP和Restful服务架构的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-WSAPI将其与SOAP匹配。是的,您仍然需要对什么是SOAP有一个基本的了解。但是,由于JAX-WSAPI,您可以轻松地开发SOAP web服务

因为JAX-WS和JAX-RS只是api,所以每个api都有不同的实现。例如,对于JAX-WS,有,个实现。而对于JAX-RS,则有等实现。它们使用相同的API,但实现完全不同。应用服务器也提供自己的实现

但他们仍然需要将java对象转换为XML,因为SOAP规范强制这样做。还有一些其他库可以将Java转换为Xml,将Xml转换为Java。如和。此外,在开发rest服务时,您可能希望将java对象转换为JSON。有一些工具也用于此目的,例如或

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

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

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
    );
}