doute7910 2015-03-21 15:51
浏览 75
已采纳

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

I'm trying to write a client for this web service

It uses a two layer authentication (one in the request header and on for data access in the server) which means that I need to pass it in the header. this is what I tried to do:

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

I got this error:

    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

I admit, this is not really my cup of tea, can somebody explain what is going on?

Can I manually call this web service? using soap UI maybe?

This is the client generated in soapUI, same error when executing:

<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>
  • 写回答

1条回答 默认 最新

  • dougu1985 2016-02-24 14:13
    关注

    Try one of below solutions; You can do it in 3 ways:

    1) Use PHP SoapClient() function

    <?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 library to create instance of soap client. For NuSoap library check,
    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) Using curl you can call 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>
    ", curl_errno($ch),
        htmlspecialchars(curl_error($ch)));
    }
    
    curl_close ($ch);
    echo "Responce : ".$data;
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 xshell无法连接提示ssh服务器拒绝密码
  • ¥15 AT89C52单片机C语言关于串口通信的位操作
  • ¥20 需要步骤截图(标签-服务器|关键词-map)
  • ¥50 gki vendor hook
  • ¥15 灰狼算法和蚁群算法如何结合
  • ¥15 这是一个利用ESP32自带按键和LED控制的录像代码,编译过程出现问题,请解决并且指出错误,指导如何处理 ,协助完成代码并上传代码
  • ¥20 stm32f103,hal库 hal_usart_receive函数接收不到数据。
  • ¥20 求结果和代码,sas利用OPTEX程序和D-efficiency生成正交集
  • ¥50 adb连接不到手机是怎么回事?
  • ¥20 抓取数据时发生错误: get_mooncake_data() missing 1 required positional argument: 'driver'的问题,怎么改出正确的爬虫代码?