📜  SOAP-示例(1)

📅  最后修改于: 2023-12-03 14:47:30.206000             🧑  作者: Mango

SOAP 示例

什么是 SOAP?

SOAP(简单对象访问协议)是一种用于交换信息的协议,可以在分布式环境中使用。它是一个基于 XML 的协议,可以用于在 web 上交换信息,并以编程语言无关的方式描述 web 服务接口。

SOAP 通常使用 HTTP 作为底层传输协议,通过使用 SOAP 消息,可以在不同的操作系统、编程语言和网络协议之间进行通信。

SOAP 消息主要由三个部分组成:

  • Envelope:定义了整个消息的开始和结束。
  • Header:包含了一些客户端和服务端需要的信息。
  • Body:包含了实际的消息内容。
SOAP 如何工作?

当客户端发送一个 SOAP 请求时,它会构建一个包含在 Envelope 元素中的 XML 文档,然后将其发送到服务器。服务器会解析请求,处理它,并将响应发送回客户端。

在处理 SOAP 请求时,服务器需要知道要调用哪个 web 服务。为了实现这一点,SOAP 使用了 WSDL(Web Services Description Language)文件,WSDL 文件描述了 web 服务所提供的操作、参数以及输入和输出的格式。

如何创建 SOAP 程序?

创建一个 SOAP 程序通常需要以下步骤:

  1. 创建 WSDL 文件,其中至少包含一个 web 服务定义。
  2. 将 WSDL 文件部署到服务器上。
  3. 使用一个 SOAP 工具根据 WSDL 文件生成客户端代码。
  4. 编写服务端代码,以实现 WSDL 中定义的 web 服务操作。
  5. 将服务端代码部署到服务器上。
示例代码

以下是一个简单的 SOAP 示例,用于将两个数字相加:

WSDL 文件
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
             name="CalculatorService"
             targetNamespace="http://example.com/CalculatorService">
    <message name="AddRequest">
        <part name="x" type="xsd:int"/>
        <part name="y" type="xsd:int"/>
    </message>
    <message name="AddResponse">
        <part name="result" type="xsd:int"/>
    </message>
    <portType name="CalculatorPortType">
        <operation name="Add">
            <input message="tns:AddRequest"/>
            <output message="tns:AddResponse"/>
        </operation>
    </portType>
    <binding name="CalculatorSoapBinding" type="tns:CalculatorPortType">
        <soap12:binding style="document"
                        transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="Add">
            <soap12:operation soapAction="http://example.com/CalculatorService/Add"/>
            <input>
                <soap12:body use="literal"/>
            </input>
            <output>
                <soap12:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="CalculatorService">
        <port name="CalculatorPort" binding="tns:CalculatorSoapBinding">
            <soap12:address location="http://example.com/CalculatorService"/>
        </port>
    </service>
</definitions>
客户端代码
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import example.com.calculatorservice.Calculator;

public class CalculatorClient {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://example.com/CalculatorService?wsdl");
        QName qname = new QName("http://example.com/CalculatorService",
                                "CalculatorService");
        Service service = Service.create(url, qname);
        Calculator calculator = service.getPort(Calculator.class);
        int result = calculator.add(1, 2);
        System.out.println("Result: " + result);
    }
}
服务端代码
import javax.jws.WebService;
import example.com.calculatorservice.Calculator;

@WebService(endpointInterface = "example.com.calculatorservice.Calculator")
public class CalculatorImpl implements Calculator {
    public int add(int x, int y) {
        return x + y;
    }
}