Home >Backend Development >PHP Tutorial >Steps to create a web service using pear::soap

Steps to create a web service using pear::soap

WBOY
WBOYOriginal
2016-07-25 09:11:061168browse
  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 . "nn";
  20. }
  21. exit;
  22. ?>
复制代码

客户端代码2

  1. require_once('SOAP/Client.php');
  2. /**
  3. * All service contents, such as namespace, UEL, parameter names, etc., can be obtained from wsdl files
  4. */
  5. $wsdl = new SOAP_WSDL("http://www.shangyong.com/ws/server.php?wsdl");
  6. /**
  7. * Generate a proxy object from wsdl. This object contains all operation methods defined in the wsdl document.
  8. * Functions can be called directly through proxy objects
  9. * Advantages: easy for users to use
  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 . "nn";
  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. ?>
复制代码


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn