簡體   English   中英

如何使用 WSDL 模式使用 PHP 使用 Web 服務

[英]How to consume a webservice with PHP using WSDL mode

我正在嘗試使用 PHP 使用 Web 服務。

這是我的代碼:

<?php

ini_set('soap.wsdl_cache_enabled', false);

class SayHelloResponse
{
    public $sayHelloResult;
    public $greeting;
}

$client = new SoapClient(
    'http://localhost:8000/greetings_server.php?wsdl', [
        'trace' => 1,
        'soap_version' => SOAP_1_2,
        'classmap' => [
            'sayHelloResponse' => SayHelloResponse::class,
        ]
    ]);

if ($argc === 1) {
    echo "Service description:" . PHP_EOL;
    echo "--------------------" . PHP_EOL;
    echo "Functions:" . PHP_EOL;
    print_r($client->__getFunctions());
    echo "=====" . PHP_EOL;
    echo "Types:" . PHP_EOL;
    print_r($client->__getTypes());
} elseif ($argv[1] == "h") {
    try {
        echo "Making the call" . PHP_EOL;
        $sayHelloResponse = $client->sayHello(
            [
                'name' => $argv[2]
            ]);

        var_dump($sayHelloResponse);
        var_dump($client->__getLastResponse());
    } catch (SoapFault $exception) {
        echo "Error: " . $exception->getMessage() . PHP_EOL;
        var_dump($client->__getLastRequest());
        var_dump($client->__getLastResponse());
    }
} else {
    echo $client->sayGoodBye($argv[2]);
}

當我在沒有任何 CLI 參數的情況下運行腳本時,我得到:

Service description:
--------------------
Functions:
Array
(
    [0] => sayHelloResponse sayHello(sayHello $parameters)
    [1] => sayGoodByeResponse sayGoodBye(sayGoodBye $parameters)
)
=====
Types:
Array
(
    [0] => struct sayHello {
 string name;
}
    [1] => struct sayHelloResponse {
 string sayHelloResult;
}
    [2] => struct sayGoodBye {
 string name;
}
    [3] => struct sayGoodByeResponse {
 string sayGoodByeResult;
}
)

然后,當我使用php greetings.php h Mauro運行它時,我得到:

Making the call
object(SayHelloResponse)#2 (2) {
  ["sayHelloResult"]=>
  NULL
  ["greeting"]=>
  NULL
}
string(559) "<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="urn:Greetings" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2003/05/soap-encoding"><env:Body xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"><ns1:sayHelloResponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"><rpc:result>greeting</rpc:result><greeting xsi:type="xsd:string">Hello Mauro!</greeting></ns1:sayHelloResponse></env:Body></env:Envelope>
"

所以我可以看到我正在尋找的結果就在那里( Hello Mauro! ),我只是不知道如何訪問它:(

問題是,如果我嘗試在非 wsdl 模式下使用 web 服務,它可以正常工作,但我需要使用 WSDL(我在另一端使用另一個 PHP 腳本生成)。

而且,如果您想知道,當我使用 SoapUI 檢查它時,WSDL 似乎很好。

謝謝你的幫助

--

編輯:

我試過這個小python腳本:

from zeep import Client
client = Client('http://localhost:8000/greetings_server.php?wsdl')
result = client.GreetingsService.sayHello('Mauro')

當我運行它時,我得到:

Traceback (most recent call last):
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/xsd/types/complex.py", line 206, in parse_xmlelement
    result = element.parse_xmlelements(
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/xsd/elements/indicators.py", line 617, in parse_xmlelements
    item_subresult = element.parse_xmlelements(
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/xsd/elements/element.py", line 206, in parse_xmlelements
    raise UnexpectedElementError(
zeep.exceptions.UnexpectedElementError: Unexpected element 'greeting', expected 'sayHelloResult'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/proxy.py", line 46, in __call__
    return self._proxy._binding.send(
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/wsdl/bindings/soap.py", line 135, in send
    return self.process_reply(client, operation_obj, response)
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/wsdl/bindings/soap.py", line 231, in process_reply
    result = operation.process_reply(doc)
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/wsdl/bindings/soap.py", line 430, in process_reply
    return self.output.deserialize(envelope)
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/wsdl/messages/soap.py", line 101, in deserialize
    body_result = self._deserialize_body(body)
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/wsdl/messages/soap.py", line 442, in _deserialize_body
    result = self.body.parse(xmlelement, self.wsdl.types, context=context)
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/xsd/elements/element.py", line 126, in parse
    return xsd_type.parse_xmlelement(
  File "/home/mauro/.local/lib/python3.8/site-packages/zeep/xsd/types/complex.py", line 212, in parse_xmlelement
    raise XMLParseError(exc.message)
zeep.exceptions.XMLParseError: Unexpected element 'greeting', expected 'sayHelloResult'

由此我得知 WSDL 與服務器返回的響應之間存在不匹配...我檢查了較舊版本的 greetings.wsdl 文件並發現了這個神秘的“問候”元素。 我想一定有緩存問題,但我無法解決。

我正在使用的python庫是這個

我終於得到了答案……這是一個困難的答案,我什至不確定我是如何發現它的,但問題出在 WSDL 定義中。

更具體地說,綁定樣式是錯誤的(或者至少與我使用的客戶端不兼容)。

原始文件是document ,我需要它是rpc

一旦我做了那個小小的改變,一切都按預期工作。

我要為其他人留下對我的代碼的引用

編輯:為了記錄, 這個網站的例子是給我提示的那個:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM