与PHP一起使用的SOAP的基础知识


The basics of SOAP used with PHP

我知道回答这类问题不是这个网站的主要想法,但几天后我将有机会申请一个初级(或者更准确地说是一个试用期)的PHP程序员职位,这就是我决定在这里发帖的原因,希望它会很好。与这里的其他公司相比,该公司有点大,所以众所周知,对于想担任这个职位的人来说,考试是什么——要么是写分页脚本,要么是某种SOAP服务。我对分页没有问题,但从现在起,我从来没有太关注过SOAP,现在我需要学习与PHP一起使用SOAP服务的基础知识。鉴于我正在申请的职位,没有人希望展示一些精彩的东西,但我仍然需要对SOAP客户端和服务器服务有基本的了解,也许我现在甚至不会为WSDL而烦恼,因为我认为我没有足够的时间处理所有事情。因此,我有一个示例代码,它很可能是我需要编写和解释的。如果我要编写SOAP服务:

客户端-

<?php
if (isset($_REQUEST["cname"]) && isset($_REQUEST["cpass"])) 
{
  $cname = $_REQUEST["cname"];
  $md5pass = md5( $_REQUEST["cpass"]);
  $client = new SoapClient(null, array(
      'location' => "http://localhost/test/BuildInSoapWithWSDL/server.php",
      'uri'      => "urn://localhost/test/BuildInSoapWithWSDL/",
      'trace'    => 1 ));
  try 
  {
        if ( $client->saveUserNameAndPass($cname, $md5pass)) 
           {echo "Data updated!";} 
    else 
      {echo "Error updating data!";}
        print "<pre>'n";
    print "Request :'n".htmlspecialchars($client->__getLastRequest()) ."'n";
    print "Response:'n".htmlspecialchars($client->__getLastResponse())."'n";
    print "</pre>";
  }
  catch (Exception $e) 
  {
      echo 'Exception: ',  $e->getMessage(), "'n";
  }
}
else
{ 
  echo "Error!"; 
}
?>

服务器端-

<?php
$server = new SoapServer(null, array('uri' => 'urn://localhost/test/BuildInSoapWithoutWSDL/'));
$server->addFunction("saveUserNameAndPass");
$server->handle();
function database_connect($host, $account, $password, $dbname)
{
  $connect = mysql_connect($host, $account, $password);
  $connect = mysql_select_db($dbname, $connect);
  return $connect;
}
function saveUserNameAndPass($userName,$passWord) 
{
   try 
   {
      if (database_connect("localhost", "saveuser", "123456", "savetask") == 1)
      {
        $userName = mysql_real_escape_string($userName);
        $sql = "INSERT INTO accounts (name,passmd5) VALUES ('".$userName."','".$passWord."')";
        $result = mysql_query($sql);
        mysql_close();
        if ($result) 
          { return true;}
        else
          { return false;}
      }
      else
      { 
          return false; 
      }
   }
   catch (Exception $e) 
   {
     return false;
   }
}
?>

即使我有了代码,我仍然对什么做什么知之甚少。因此,在编写SOAP服务时,我需要对基础知识进行一些解释,如果在这里讨论这个topci是不可接受的,我将感谢从初学者的角度解释这些东西的任何来源。

感谢

SOAP的使用方式与MySQL数据库的交互方式相同。我可以给您举一个现实生活中的例子,用于连接AtlassianJIRAweb应用程序。

一开始,你只是建立联系。您将需要一个WSDL文件,该文件包含所有内容,包含该特定SOAP服务器允许您执行的每一个功能:

try { $soapObject = new SoapClient('http://jira/rpc/soap/jirasoapservice-v2?wsdl'); }
catch(Exception $ex) { die('SOAP connection failed: '$ex->getMessage()); }

连接完成后,您只需使用即可。如果需要,请登录:

$authToken = $soapObject->login(JIRA_LOGIN, JIRA_PASS);

然后将请求发送到服务器:

$jqlquery = "status not in (Closed,Resolved) and assignee = user");
try { $issues = $soapObject->getIssuesFromJqlSearch($authToken, $jqlquery, 20); }
catch(Exception $ex) { die('JIRA query failed: '$ex->getMessage()); }

工作成果:

foreach ($issues as $k => $v) { $users[$v->reporter] = array('fullname'=>$soapObject->getUser($authToken,$v->reporter)->fullname,'name'=>$v->reporter); }
$project = $soapObject->getProjectByKey($authToken,"PROJECT");

请注意,getIssuesFromJqlSearch、getUser、getProjectByKey等都是特定于应用程序的命令(在这种情况下,所有方法/函数都在JIRA RPC插件文档中进行了描述)。

就是这样。你不需要"断开连接",当加载完成时,调用析构函数,它会自动关闭连接。