0

我完全是 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

什么是动作,我应该把什么作为版本,我知道 - 一个肥皂版本 1.2 但参数是int所以它不能被分配一个1.2值大声笑......

编辑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'的东西 - 超出了我的理解。这让我想把头撞到墙上。

4

1 回答 1

1

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

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

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

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

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

于 2012-09-06T02:54:44.460 回答