我是XML和SOAP的完整菜鸟,
你能给出一些关于至少从哪里开始的建议,或者一些例子吗?
(我不是要为我编写代码)
以下是规格:
我希望收到两个 double 值。什么是最简单的方法呢?
POST /CurrencyConvertor.asmx HTTP/1.1
Host: www.webservicex.net
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<ConversionRate xmlns="http://www.webserviceX.NET/">
<FromCurrency>PHP</FromCurrency>
<ToCurrency>USD or EUR</ToCurrency>
</ConversionRate>
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<ConversionRateResponse xmlns="http://www.webserviceX.NET/">
<ConversionRateResult>double</ConversionRateResult>
</ConversionRateResponse>
</soap12:Body>
</soap12:Envelope>
上述规格的来源:http://www.webservicex.net/CurrencyConvertor.asmx?op=ConversionRate
第一个块应该是一个请求,另一个响应是......
修改
好吧,我在一个标准的PHP课程中停了下来,但我不太明白这个__doRequest
方法的要求是什么:
$client = new SoapClient();
$client->__doRequest ( <<<EOD
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<ConversionRate xmlns="http://www.webserviceX.NET/">
<FromCurrency>PHP</FromCurrency>
<ToCurrency>USD or EUR</ToCurrency>
</ConversionRate>
</soap12:Body>
</soap12:Envelope>
EOD
, "http://www.webservicex.net/CurrencyConvertor.asmx" , $???, $??? );
http://www.php.net/manual/en/soapclient.dorequest.php
什么是动作,我应该把什么作为版本,我知道 - 肥皂版本1.2,但参数是int
所以不能分配1.2
值lol ......
EDIT2:
好吧,这是我到目前为止所得到的,但它让我得到一个空字符串......
$client = new SoapClient(null, array('location'=>'http://www.webservicex.net/CurrencyConvertor.asmx','uri'=>''));
$client->__doRequest ( <<<EOD
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<ConversionRate xmlns="http://www.webserviceX.NET/">
<FromCurrency>PHP</FromCurrency>
<ToCurrency>USD or EUR</ToCurrency>
</ConversionRate>
</soap12:Body>
</soap12:Envelope>
EOD
, "http://www.webservicex.net/CurrencyConvertor.asmx" , "ConversionRate", 2 );
echo "Response :<br>", htmlentities($client->__getLastResponse());
......我只是不知道这个'uri'的东西 - 超出我的理解。这让我想要碰到我的头。
答案 0 :(得分:1)
基本上你需要的是两个部分。
解决通信问题的SOAPClient类了解服务器URL,发送请求并接收响应(您在问题中以XML形式获得)并触发#2,即:
< / LI>第二部分是XML解析器/ marshaller,它可以将请求对象(包含fromCurrency和toCurrency)转换为服务器可以理解的正确XML字符串(根据WSDL)并将一些XML转换为响应对象再次使用WSDL。这部分有点棘手,但我找到了很多文档,搜索“SOAP PHP”,你得到一些例子)。这两个流程称为编组和解组(以帮助您更快地找到Google的内容)。您的StockQuote Web服务并不真正提供WSDL,它基本上是对所有可能操作(在您的情况下只有一个:GetQuote
)及其可用对象(在您的情况下仅为简单类型string
)的描述,不必定义,因为它们是WSDL标准)
我还没有用PHP做SOAP,但是花了很多时间使用Java + SOAP并且可以理解它有多难。从理论上讲,您只需将一些XML发送到服务器并获取一些XML。但是发送的XML必须采用正确的格式,当您收到响应时,您希望将响应转换为对象而不处理某些XML字符串。
对于像这样的简单Web服务,您可以考虑手动构建XML请求(简单地将XML字符串放在一起)和substr
响应以查找请求的答案。