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

时间:2012-09-06 02:37:27

标签: php soap

我是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'的东西 - 超出我的理解。这让我想要碰到我的头。

1 个答案:

答案 0 :(得分:1)

基本上你需要的是两个部分。

  1. 解决通信问题的SOAPClient类了解服务器URL,发送请求并接收响应(您在问题中以XML形式获得)并触发#2,即:

    < / LI>
  2. 第二部分是XML解析器/ marshaller,它可以将请求对象(包含fromCurrency和toCurrency)转换为服务器可以理解的正确XML字符串(根据WSDL)并将一些XML转换为响应对象再次使用WSDL。这部分有点棘手,但我找到了很多文档,搜索“SOAP PHP”,你得到一些例子)。这两个流程称为编组解组(以帮助您更快地找到Google的内容)。您的StockQuote Web服务并不真正提供WSDL,它基本上是对所有可能操作(在您的情况下只有一个:GetQuote)及其可用对象(在您的情况下仅为简单类型string)的描述,不必定义,因为它们是WSDL标准)

  3. 我还没有用PHP做SOAP,但是花了很多时间使用Java + SOAP并且可以理解它有多难。从理论上讲,您只需将一些XML发送到服务器并获取一些XML。但是发送的XML必须采用正确的格式,当您收到响应时,您希望将响应转换为对象而不处理某些XML字符串。

    对于像这样的简单Web服务,您可以考虑手动构建XML请求(简单地将XML字符串放在一起)和substr响应以查找请求的答案。