【问题标题】:Interacting with a soap API without WSDL in PHP在 PHP 中与没有 WSDL 的肥皂 API 交互
【发布时间】:2018-05-02 11:09:03
【问题描述】:

最近获得了用于酒店管理服务的肥皂 API 的访问权限。他们提供的文档显示了请求的基本示例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">    
<soapenv:Header>       
  <Auth xmlns="http://xxxx/xxxxAPI">          
  <FromSystemId ID="1">CompanyName</FromSystemId>          
    <UserName>username</UserName>          
    <Password>password</Password>       
  </Auth>    
</soapenv:Header>    
<soapenv:Body>       
  <GetRegions Timestamp="2016-04-11" Version="1.0" Lang="en" 
     xmlns="http://xxxx/xxxxAPI">
  <Country Code="GB" />  
  </GetRegions>    
</soapenv:Body> 
</soapenv:Envelope>

他们还在其文档中提供了函数列表以及每个函数所需的参数。但是我对如何执行请求有点困惑,因为我以前从未使用过肥皂 API。他们也没有提供 WSDL,这有关系吗?

无论如何,这就是我想尝试执行请求的方式

$soapURL = "http://xxxx/xxxxAPI" ;
$soapParameters = Array('login' => "username", 'password' => "password") ;
$soapFunction = "getRegions";
$soapFunctionParameters = Array('countrycode' => 'GB');

$soapClient = new SoapClient($soapURL, $soapParameters);

$soapResult = $soapClient->__soapCall($soapFunction, 
$soapFunctionParameters) ;

if(is_array($soapResult) && isset($soapResult['someFunctionResult'])) {
    // Process result.
} else {
    // Unexpected result
    if(function_exists("debug_message")) {
        debug_message("Unexpected soapResult for {$soapFunction}: ".print_r($soapResult, TRUE)) ;
    }
}

我这样做是否正确?我现在无法对此进行测试,因为我还没有收到我的身份验证,但我想现在就开始。

任何帮助都会很棒。

【问题讨论】:

标签: php xml api soap


【解决方案1】:

这是一个小例子。

$opts = array(
    'location' => 'http://xxxx/xxxxAPI',
    'uri' => 'urn:http://test-uri/'
);

$client = new SOAPClient(null, $opts);

$headerData = array(
    'FromSystemId' => 'CompanyName',
    'UserName' => 'username',
    'Password' => 'password',
);

// Create Soap Header.
$header = new SOAPHeader('http://xxxx/xxxxAPI', 'Auth', $headerData);

// Set the Headers of Soap Client.
$client->__setSoapHeaders($header);


$result = $client->__soapCall('getRegions', array('GB'));

// $return = $client->__soapCall('getRegions', array(new SoapParam(new SoapVar('GB', XSD_STRING), 'countryCode')));

var_dump($result);

他们也没有提供 WSDL,这有关系吗?

为了能够添加 HEADER 属性,它们必须在 WSDL 中提及。如果它们不存在于 WSDL 中,它们将不会显示为属性,而是显示为 &lt;item&gt;&lt;key/&gt;&lt;value/&gt;&lt;/item&gt; 元素。

提示:如果您知道请求必须是什么并且您没有 WSDL,那么请尝试手动生成 HTTP 标头和 XML 正文并使用 CURL 或 Guzzle 执行请求。

Guzzle 示例:

$soapContent = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">    
<soapenv:Header>       
  <Auth xmlns="http://xxxx/xxxxAPI">          
  <FromSystemId ID="1">CompanyName</FromSystemId>          
    <UserName>username</UserName>          
    <Password>password</Password>       
  </Auth>    
</soapenv:Header>    
<soapenv:Body>       
  <GetRegions Timestamp="2016-04-11" Version="1.0" Lang="en" 
     xmlns="http://xxxx/xxxxAPI">
  <Country Code="GB" />  
  </GetRegions>    
</soapenv:Body> 
</soapenv:Envelope>';

$client = new GuzzleHttp\Client([
    'headers' => [ 'SOAPAction' => '"urn:http://xxxx/xxxxAPI/#getRegions"' ]
]);

$response = $client->post('http://xxxx/xxxxAPI',
    ['body' => $soapContent]
);

echo $response;

【讨论】:

  • 非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多