PHP和SOAP集成

问题描述:

我从客户端连接到SOAP服务器,并试图发回表单信息。PHP和SOAP集成

连接有效,但我不知道如何发回数据。我已收到文档( - >http://s000.tinyupload.com/?file_id=89258359616332514672),并被卡在功能AddApplication

这是我迄今为止编写的PHP代码。目前还没有形式整合,只有虚拟数据。

<? 

    $client = new SoapClient(
     'https://wstest.hrweb.be/TvBastards/TvBastards/Job.svc?singleWsdl', 
     array(
      'soap_version' => SOAP_1_1 
     ) 
    ); 

    $params = array(
     'username' => 'XXX', 
     'password' => 'XXX', 
     'environmentKey' => 'XXX', 
    ); 

    //Open session 
    try{ 
     $token = $client->OpenSession($params); 
    }catch(SoapFault $ex){ 
     echo "<pre>"; 
     print_r($ex->detail->ExceptionDetail); 
     echo "</pre>"; 
    } 

    //Add Application 
    try{ 
     $resp = $client->AddApplication($params, ___THE_XML_SHOULD_BE_HERE___); // I have no idea how I can implement a XML file over here, and make this part work 
    }catch(SoapFault $ex){ 
     echo "<pre>"; 
     print_r($ex->detail->ExceptionDetail); 
     echo "</pre>"; 
    } 

    //Close session 
    try{ 
     $app = $client->CloseSession($token); 
    }catch(SoapFault $ex){ 
     echo "<pre>"; 
     print_r($ex); 
     echo "</pre>";  
    }` 

我现在收到的错误是:

End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. Found element 'param1' from namespace ''. Line 2, position 156. 

这是可以理解的,因为我不提供任何XML。

我收到我的令牌,因此OpenSession完美工作。如上所述,我完全停留在AddApplication函数中。这是我第一次遇到一个SOAP服务,因此我非常赞赏每一个可能的解释。

修复它,并希望它可以帮助其他人。我会尝试将其分成几个步骤。

define('SIM_LOGIN', 'LOGIN NAME HERE'); 
define('SIM_PASSWORD', 'LOGIN PASSWORD HERE'); 
define('ENV_KEY', 'ENVIRONMENT KEY HERE'); 

/*** login parameters ***/ 
$params = array(
    'username' => SIM_LOGIN, 
    'password' => SIM_PASSWORD, 
    'environmentKey' => ENV_KEY, 
); 

/*** Set up client ***/ 
$client = new SoapClient(
    __SOAP URL HERE__, 
    array(
    'soap_version' => SOAP_1_1 
) 
); 

设置参数并连接到客户端后,我们可以开始调用SOAP服务中的函数。每个SOAP服务都会有所不同,因此函数名称和参数可能会有所不同。在下面的例子中,我需要打开一个会话来检索一个令牌。此令牌用于所有其他功能,因此此功能是必需的。如果失败,我会调用“abort()”函数。

try{ 
    $token = $client->OpenSession($params); 
}catch(SoapFault $ex){ 
    abort(); 
} 

如果接收到令牌,则调用AddApplication函数。这需要令牌参数和一个“对象”(基本上是一个STDClass)。

我创建我的所有数据的stdClass的:

/*** Create stdClass with requested data ***/ 
$std = new stdClass(); 

$std->Firstname   = $firstname; 
$std->Lastname   = $lastname; 
$std->Birthdate   = $birthdate; 
$std->Phone    = $phone; 
$std->Email    = $email; 

一定要检查名称或资本的驼峰规则,因为这使所有的差异。

现在我们调用带有参数“token(string)”和“application(object)”的AddApplication函数。

/*** AddApplication ***/ 
try{ 
    $result = $client->AddApplication(array("token" => $token, "application" => $std)); 
}catch(SoapFault $ex){ 
    abort(); 
} 

如果一切顺利,数据存储在外部服务器上,并且您收到“成功”消息。即使没有进入SoapFault,您也有可能会收到“失败”。一定要记录“$ result”和“$ ex”,因为SOAP服务可以返回“失败”,但try-catch将此视为良好结果。

最后要做的就是关闭会话(和破坏令牌)

/*** CloseSession ***/ 
try{ 
    $app = $client->CloseSession($token); 
}catch(SoapFault $ex){ 
    abort(); 
} 

如果有任何疑问,请不要犹豫,在这里问他们,我会很乐意帮助像我这样的问题搞清楚这一点。