如何在php中使用soap 1.2获取报价


how to get quotes with soap 1.2 in php?

我完全不懂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"的意思——超出了我的理解范围。这让我想把头撞到墙上。

基本上您需要两个部分。

  1. 一个SOAPClient类,它解决了通信,知道服务器URL,发送请求和接收响应(您在问题中得到的是XML),还触发了#2,即:

  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作为查找请求答案的响应。