php - 使用 php 客户端使用 Web 服务(Soap)

标签 php web-services soap xpath

我正在尝试为此编写一个客户端 web service

它使用两层身份验证(一个在请求 header 中,一个用于服务器中的数据访问),这意味着我需要在 header 中传递它。这就是我试图做的:

class ChannelAdvisorAuth 
{ 
    public $DeveloperKey; 
    public $Password; 

    public function __construct($key, $pass) 
    { 
        $this->DeveloperKey = $key; 
        $this->Password = $pass; 
    } 
} 

$devKey      = "user"; 
$password    = "pass"; 

$soapArr = array(
    "trace"=>true,
    "exceptions"=>true,
);

$url         = "http://soalive.grimaldiwebservices.it/framework/JourneyManager?wsdl"; 
$client     = new SoapClient($url, $soapArr); 
echo "client created!"; 
print_r($client -> __getFunctions());
$auth         = new ChannelAdvisorAuth($devKey, $password); 
$header     = new SoapHeader($url, "APICredentials", $auth, false); 

$in0 = array( 
    "in0" => array( 
        "user"        => "user", 
        "password"    => "pass",
        "message-id"  => "",
        "status"   => array("error-code" => "", "error-desc" => ""),
        "shiplist"   => array("code-ship" => "", "desc-ship" => "")
    ));


echo "athenticated"; 

$result = $client->__soapCall("getShips", $in0); //line 41

我收到此错误:
    Fatal error: Uncaught SoapFault exception: [env:Server] XPath expression 
failed to execute. An error occurs while processing the XPath expression; the 
expression is 
ora:parseEscapedXML(bpws:getVariableData('OnMessage_getShips_InputVariable','par
ameters','/ns1:getShips/ns1:in0')). The XPath expression failed to execute; the
 reason was: Start of root element expected.. Check the detailed root cause 
described in the exception message text and verify that the XPath query is 
correct. in C:\Program Files (x86)\xampp\htdocs\Test\index.php:41 Stack trace: 
#0 C:\Program Files (x86)\xampp\htdocs\Test\index.php(41): SoapClient-
>__soapCall('getShips', Array) #1 {main} thrown in C:\Program Files 
(x86)\xampp\htdocs\Test\index.php on line 41

我承认,这真的不是我的那杯茶,有人能解释一下这是怎么回事吗?

我可以手动调用此 Web 服务吗?也许使用 SOAP 用户界面?

这是soapUI中生成的客户端,执行时同样报错:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gfw="http://gfw.services.grimaldilines.com">
   <soapenv:Header>
   <soapenv:Body>
      <gfw:getShips>
         <gfw:in0>?</gfw:in0>
      </gfw:getShips>
   </soapenv:Body>
</soapenv:Envelope>

最佳答案

尝试以下解决方案之一;您可以通过 3 种方式进行操作:

1) 使用 PHP SoapClient()功能

<?php

$wsdl   = "https://<your_web_service_url>?wsdl";
$client = new SoapClient($wsdl, array('trace'=>1));  // The trace param will show you errors stack

// web service input params
$request_param = array(
    "param1" => $value1,
    "param2" => $value2,
    "param3" => $value3,
    "param4" => $value4
);

try
{
    $responce_param = $client->webservice_methode_name($request_param);
   //$responce_param =  $client->call("webservice_methode_name", $request_param); // Alternative way to call soap method
} 
catch (Exception $e) 
{ 
    echo "<h2>Exception Error!</h2>"; 
    echo $e->getMessage(); 
}
?>

2) NuSoap 库来创建soap 客户端的实例。对于 NuSoap 库检查,
NuSoap Library and soap client Example .
<?php
require_once('lib/nusoap.php');

$wsdl   = "http://<your_web_service_url>?wsdl";
$client = new nusoap_client($wsdl, 'wsdl');

// Input params
$username = "username";
$password = "pass";

// In this demo, we use json data , you can use any other data format for same
$json     = '{"param1":"value1","param2":"value2"}';

$client->setCredentials($username, $password);
$error = $client->getError();

if ($error)
{
    echo $error; die();
}

$action = "webservice_methode_name"; // webservice method name

$result = array();

if (isset($action))
{
    $result['response'] = $client->call($action, $json);
}

echo "<h3>Output : </h3>";
echo $result['response'];
echo "<h2>Request</h2>";
echo "<pre>" . htmlspecialchars($client->request, ENT_QUOTES) . "</pre>";
echo "<h2>Response</h2>";
echo "<pre>" . htmlspecialchars($client->response, ENT_QUOTES) . "</pre>";
?>

3) 使用 curl 你可以调用 Soap webservice
<?php
$webservice_url = "https://<your_web_service_url>";

$request_param = array(
                    "param1" => $value1,
                    "param2" => $value2,
                    "param3" => $value3,
                    "param4" => $value4
                );

$ch = curl_init($webservice_url);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $request_param);
//curl_setopt ($ch, CURLOPT_TIMEOUT, 120);
// time allowed to connect to server 
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30); 
// time allowed to process curl call 
curl_setopt($ch,CURLOPT_TIMEOUT,120); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "<username>:<password>");

/* ** Alternative way to set username and password ** */
//$headers = array(
//    'Content-Type:application/xml',
//    'Authorization: Basic '. base64_encode("<username>:<password>")
//);
//curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_SSLVERSION,3);

$data = curl_exec ($ch);

$result = $data;

if ($result === FALSE) {
    printf("cUrl error (#%d): %s<br>\n", curl_errno($ch),
    htmlspecialchars(curl_error($ch)));
}

curl_close ($ch);
echo "Responce : ".$data;
?>

关于php - 使用 php 客户端使用 Web 服务(Soap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29184674/

相关文章:

c# - 如何在 C# 中制作 SOAP/WSDL 客户端?

php - 连接多个表中的数据

php - 使用在线PHP数据库进行离线测试,但不上传文件到服务器

php - Yii2:动态表单小部件 wbraganca 不是

php - 按升序选择最后 20 个订单 - PHP/MySQL

web-services - 如何接收短信 "from around the world"并存入网站数据库?

java - 如何在 URL 中传递两个查询参数

Java - 错误非默认 namespace 无法映射到 XML 1.0 文档中的空 URI

android - 使用 Android 从云端检索数据

c# - WCF : How cand you add multiple MessageBodyMember to a MessageContract if one is Stream