PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

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

原创
2016-07-25 09:11:06 1015浏览
  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. ?>
复制代码


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。