我完全不懂XML和SOAP,
你能给出一些建议,至少从哪里开始,或者举一些例子吗?
(我不是乞求为我写代码)
以下是规格:
我只希望收到两个双值。什么是最简单的方法?
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
什么是操作,我应该把什么作为版本,我知道-一个soap版本1.2,但参数是int
,所以不能给它分配1.2
值lol…
第2版:
好吧,这就是我到目前为止所得到的,但它给了我一个空字符串。。。
$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"的意思——超出了我的理解范围。这让我想把头撞到墙上。
基本上您需要两个部分。
-
一个SOAPClient类,它解决了通信,知道服务器URL,发送请求和接收响应(您在问题中得到的是XML),还触发了#2,即:
-
第二部分是XML解析器/整理器,它可以将请求对象(包含fromCurrency和toCurrency)转换为服务器能够理解的正确XML字符串(根据WSDL),并使用WSDL将一些XML再次转换为响应对象。这部分有点棘手,但我找到了很多相关文档,搜索"SOAPPHP",就会得到一些示例)。这两个过程被称为编组和解组(帮助您使用谷歌更快地找到东西)。StockQuote Web服务并没有真正提供WSDL,它基本上是对所有可能的操作(在您的情况下只有一个:
GetQuote
)及其可用对象的描述(在您情况下只有简单的类型string
,因为它们是WSDL标准,所以不必定义)
我没有用PHP做过SOAP,但花了很多时间在Java+SOAP上,我能理解它有多困难。理论上,你只需向服务器发送一些XML,然后再获得一些XML。但是,发送的XML必须是正确的格式,并且当您收到响应时,您希望将响应转换为对象,而不是处理某些XML字符串。
对于像这样的简单web服务,您可以考虑手动构建XML请求(简单地将XML字符串放在一起),并将响应substr
作为查找请求答案的响应。