__dispatch_map['getquote'] = array( in => array(category => string), out => array(quote => int) ); $this->__dispatch_map['getfruit'] = array( in => array(), out => array(fruitsummary => {urn:fruitquoteservice}fruitstruct) ); $this->__typedef['fruitstruct'] = array( 'category'=>'string', 'amount' => 'int' ); } public function getquote($category) { switch ($category) { case 'apple': $quote = 10; break; case 'orange': $quote = 12; break; case 'banana': $quote = 20; break; default: $quote = 0; break; } return $quote; }//end funtion public function getfruit() { $list = array( array(apple, 100), array(orange, 500), array(banana, 260) ); return $list; }//end funtion}//end class?>
复制代码
第二步:创建server.php 这个程序将接收并处理客户端的请求
addobjectmap($fruitquote, http://www.xxx.com);if (isset($_server['request_method']) && $_server['request_method']=='post'){ $server->service($globals['http_raw_post_data']);} else{ require_once 'soap/disco.php'; $disco = new soap_disco_server($server,'fruitquoteservice'); header(content-type: text/xml); if (isset($_server['query_string']) && strcasecmp($_server['query_string'],'wsdl')==0) { echo $disco->getwsdl(); } else { echo $disco->getdisco(); }}exit;?>
复制代码
现在可以通过http://www.shangyong.com/ws/server.php?wsdl 查看wsdl文档。
disco:一项微软用来发布和发现web服务的技术,定义了一个从给定的url获取web服务描述的简单的http get机制
第三步:创建web服务客户端代码
require_once('soap/client.php');//这个名称空间必须和server.php中定义的一致$options = array('namespace' => 'http://www.xxx.com', 'trace' => 1); //为1表示可以通过__get_wire获取soap消息,默认是0$client = new soap_client(http://www.shangyong.com/ws/server.php);$params = array();$response = $client->call(getfruit, $params, $options);//print_r($client->__get_wire()); //输出 soap消息if (pear::iserror($response)) { echo 'error: ' . $response->getmessage() .
\n;} else { print_r($response) . \n;}$params = array(name => orange);$response = $client->call(getquote, $params, $options);if (pear::iserror($response)) { echo 'error: ' . $response->getmessage() .
\n;} else { echo $response . \n\n;}exit;?>
复制代码
客户端代码2
require_once('soap/client.php');/** * 所有的服务内容,如:命名空间、uel, 参数名等都可以从wsdl文件获取 */$wsdl = new soap_wsdl(http://www.shangyong.com/ws/server.php?wsdl);/** * 从wsdl生成一个proxy对象,这个对象包含wsdl文档中定义的所有操作的方法。 * 可以通过proxy对象直接调用函数 * 优点:易于用户使用 */$client = $wsdl->getproxy();$response = $client->getquote(apple);if (pear::iserror($response)) { echo 'error: ' . $response->getmessage() .
\n;} else { echo $response . \n\n;}$response = $client->getfruit();if (pear::iserror($response)) { echo 'error: ' . $response->getmessage() .
\n;} else { print_r($response) . \n;}exit;?>
复制代码