欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

使用pear::soap创建web服务的步骤

程序员文章站 2022-03-30 13:28:37
...
  1. class FruitQuoteService
  2. {
  3. public $__dispatch_map = array();
  4. public $__typedef = array();
  5. public function FruitQuoteService()
  6. {
  7. $this->__dispatch_map['getQuote'] = array(
  8. "in" => array("category" => "string"),
  9. "out" => array("quote" => "int")
  10. );
  11. $this->__dispatch_map['getFruit'] = array(
  12. "in" => array(),
  13. "out" => array("fruitSummary" => "{urn:FruitQuoteService}fruitStruct")
  14. );
  15. $this->__typedef['fruitStruct'] = array(
  16. 'category'=>'string', 'amount' => 'int'
  17. );
  18. }
  19. public function getQuote($category)
  20. {
  21. switch ($category)
  22. {
  23. case 'apple':
  24. $quote = 10;
  25. break;
  26. case 'orange':
  27. $quote = 12;
  28. break;
  29. case 'banana':
  30. $quote = 20;
  31. break;
  32. default:
  33. $quote = 0;
  34. break;
  35. }
  36. return $quote;
  37. }//end funtion
  38. public function getFruit()
  39. {
  40. $list = array(
  41. array("apple", 100),
  42. array("orange", 500),
  43. array("banana", 260)
  44. );
  45. return $list;
  46. }//end funtion
  47. }//end class
  48. ?>
复制代码

第二步:创建server.php 这个程序将接收并处理客户端的请求

  1. require_once("FruitQuoteService.php");
  2. require_once("SOAP/Server.php");
  3. $fruitQuote = new FruitQuoteService();
  4. $server = new Soap_Server();
  5. $server->addObjectMap($fruitQuote, "http://www.xxx.com");
  6. if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST')
  7. {
  8. $server->service($GLOBALS['HTTP_RAW_POST_DATA']);
  9. } else
  10. {
  11. require_once 'SOAP/Disco.php';
  12. $disco = new SOAP_DISCO_Server($server,'FruitQuoteService');
  13. header("Content-type: text/xml");
  14. if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl')==0) {
  15. echo $disco->getWSDL();
  16. } else {
  17. echo $disco->getDISCO();
  18. }
  19. }
  20. exit;
  21. ?>
复制代码

现在可以通过http://www.shangyong.com/ws/server.php?wsdl 查看wsdl文档。

DISCO:一项微软用来发布和发现Web服务的技术,定义了一个从给定的url获取web服务描述的简单的HTTP GET机制

第三步:创建web服务客户端代码

  1. require_once('SOAP/Client.php');
  2. //这个名称空间必须和server.php中定义的一致
  3. $options = array('namespace' => 'http://www.xxx.com',
  4. 'trace' => 1); //为1表示可以通过__get_wire获取soap消息,默认是0
  5. $client = new SOAP_client("http://www.shangyong.com/ws/server.php");
  6. $params = array();
  7. $response = $client->call("getFruit", $params, $options);
  8. //print_r($client->__get_wire()); //输出 soap消息
  9. if (PEAR::isError($response)) {
  10. echo 'Error: ' . $response->getMessage() . "
    \n";
  11. } else {
  12. print_r($response) . "\n";
  13. }
  14. $params = array("name" => "orange");
  15. $response = $client->call("getQuote", $params, $options);
  16. if (PEAR::isError($response)) {
  17. echo 'Error: ' . $response->getMessage() . "
    \n";
  18. } else {
  19. echo $response . "\n\n";
  20. }
  21. exit;
  22. ?>
复制代码

客户端代码2

  1. require_once('SOAP/Client.php');
  2. /**
  3. * 所有的服务内容,如:命名空间、UEL, 参数名等都可以从wsdl文件获取
  4. */
  5. $wsdl = new SOAP_WSDL("http://www.shangyong.com/ws/server.php?wsdl");
  6. /**
  7. * 从wsdl生成一个proxy对象,这个对象包含wsdl文档中定义的所有操作的方法。
  8. * 可以通过proxy对象直接调用函数
  9. * 优点:易于用户使用
  10. */
  11. $client = $wsdl->getProxy();
  12. $response = $client->getQuote("apple");
  13. if (PEAR::isError($response)) {
  14. echo 'Error: ' . $response->getMessage() . "
    \n";
  15. } else {
  16. echo $response . "\n\n";
  17. }
  18. $response = $client->getFruit();
  19. if (PEAR::isError($response)) {
  20. echo 'Error: ' . $response->getMessage() . "
    \n";
  21. } else {
  22. print_r($response) . "\n";
  23. }
  24. exit;
  25. ?>
复制代码