0

我正在尝试向客户端的 API 端点发送 SOAP 请求。我对 SOAP 一点也不熟悉,所以很难让它发挥作用。

来自客户的文档

The requested ticket can be used to call all the API web methods subsequently.

    public string RequestTicket( 
        string username,
        string password
    );

URL
    https://www.clientsurl.net/api/v01_00/APIService.asmx?wsdl


Parameters
    string username 
    string password
 

我能够创建 WSDL

    $client = new Client('https://www.clientsurl.ca/api/v01_00/APIService.asmx?wsdl', ['soap_version' => SOAP_1_1]);

但不确定如何发送参数

    $params = [
        'username' => 'myusername' 
        'password' => 'mypassword' 
    ];

我也不确定相关性RequestTicket是什么。我应该将它添加到网址吗?

答案可能很简单,但是经过大量搜索后,我找不到任何东西。请帮忙。

4

2 回答 2

1

SOAP 服务具有一组可以通过网络调用的操作。这些操作也可以有参数。基本上,这就像在代码中调用带有参数的方法一样,调用发生在网络上,方法名称和参数被编组为符合 SOAP 协议规则的 XML。

要调用 SOAP 服务,您可以向服务的端点(即https://www.clientsurl.ca/api/v01_00/APIService.asmx)发出 POST 类型的 HTTP 请求,也可以使用 SOAP 客户端。SOAP 客户端是您可以从 SOAP Web 服务的 WSDL 生成的一些代码,或者是一些可以动态读取 WSDL 并为您提供调用其中描述的操作的一些方法的代码。与发出 POST HTTP 请求相反,客户端会为您处理这些细节,并允许您通过网络进行调用,就像您在代码中调用本地方法一样。

要在客户端代码中调用 SOAP 服务的操作,您必须调用带有参数的方法。方法的名称及其参数(什么名称和什么类型)由服务的 WSDL 描述。

话虽如此,我将添加一些有关您在问题中发布的内容的详细信息。

请求的票证可用于随后调用所有 API Web 方法。

某些服务操作可能需要身份验证才能被允许调用它们。就像您需要用户名和密码才能访问网站的受保护部分一样。对于 SOAP Web 服务,他可以通过几种方式发生,最常见的两种是:

  1. 您在每次调用 Web 服务时发送用户名和密码(不知何故;可以作为 SOAP 标头,作为具有基本身份验证的 HTTP 标头等)。
  2. 该服务公开了一个您必须使用用户名和密码调用的方法,就像第 1 点一样,但随后返回某种访问令牌,然后您需要将其提供给 Web 服务的其余操作。这就像网站上的登录页面,您在其中使用用户名和密码进行身份验证,然后您会返回一个 SessionID,您可以将其用于所有其他请求,直到您决定退出。

您的服务似乎使用了第二种方法,并且RequestTicket似乎是您需要调用的操作,以便之后能够调用其余操作。

我能够创建 WSDL

您不创建 WSDL,Web 服务的 WSDL 已经存在。还要确保不要混淆 SOAP Web 服务和它的 WSDL。您显示的代码只是从 WSDL(我在上面描述的)创建一个 SOAP 客户端,以允许您对其调用操作。

我也不确定 RequestTicket 的相关性是什么。我应该将其添加到网址吗?

很可能RequestTicket是 Web 服务的操作。您应该查看 WSDL 内部以查看它是否在那里进行了描述。如果您不熟悉 WSDL 是如何工作的,那么它有点难以接受,因此最好的办法是使用像SoapUI这样的工具为其提供 Web 服务 WSDL 并让 SoapUI 为 Web 服务生成示例请求。然后,您还可以使用 SoapUI 测试 Web 服务,以确保在尝试使用 PHP 代码复制相同的调用之前了解它的工作原理。

于 2021-07-04T09:22:13.393 回答
1

我写了一个发送请求的方法

protected function soapRequest(string $method, array $arguments)
{
    try {
       $client = new \Zend\Soap\Client($this->getWsdl(),
            [
                'soap_version' => SOAP_1_1,
                'cache_wsdl' => WSDL_CACHE_NONE
            ]);
        $result = $client->{$method}($arguments);
        return $result->return;
    } catch (\SoapFault $s) {
       ...
    } catch (\Exception $e) {
       ...
    }
}

您必须有一个 Soap 方法来发送您的参数。如果您不知道方法名称,我建议您运行 SoapUI 应用程序,这对于调试soap 请求非常有用。

于 2021-07-04T08:12:39.847 回答