您当前位于: 首页 » 我爱PHP » 入门级的讲讲soap这个php webservice

入门级的讲讲soap这个php webservice07/28/2010

写在前面的话:某天中午,我和同事们一起吃饭,期间我们聊到《XXX》游戏,不可否认,它确实很令人称赞,然后我问JJ,你多少级?他回8级,另个同事已经13级(高玩啊),然后我便开玩笑,JJ你个位数也好意思拿出来说,然后大家问我几级,我6级,哈哈哈,大家都笑了。。。师傅这时候说:“五十步笑百步,有意义么?”,当然这仅仅是我们几个开的一个玩笑。鲁迅先生曾说“文人相轻”,从我这么久泡论坛的经历来看,我们程序员也爱相轻,很多时候,我都觉得这个太不可思议了,技术本是拿来促进社会进步,改善生存环境的一种手段,大家都是同行,又有什么好互相看不起的呢?

进入正题,今天我打算总结下php自带的soap类的使用,总结才有进步。

1、通过开放的webservice获取天气预报数据

这里通过一个开放的提供soap webservice接口的网站说明下如何根据wsdl(什么是wsdl?)使用php调用现有的soap服务!

<?php
/**
 * 从开放的天气预报服务中获得数据
 *
**/
 
$c = new SoapClient( 'http://www.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl',
			     array( 'trace' => true, 'exceptions' => true ) );
 
//var_dump( $c->__getFunctions() );
//var_dump( $c->__getTypes() );
//不需要参数的情况
$pr =$c->getRegionProvince();
//var_dump( $pr->getRegionProvinceResult->string );
 
//带有参数的情况
$scs = $c->getSupportCityString( array( 'theRegionCode' => '福建' ) );
var_dump( $scs->getSupportCityStringResult->string );
 
//也可以这样做
$we = $c->__call('getWeather', array( array( 'theCityCode' => 2210 ) ) );
var_dump( $we );
?>

2、如何实现php的soapServer和SoapClient

还是看代码不说话,我这里有个简单的例子,注意,实际应用中一定要对异常进行处理,否则不方便和php以外的程序通信。
这是服务端代码:

<?php
$ss = new SoapServer( null, array( 'uri' => 'http://zendstudio.Net' ) );
$ss->setClass( 't', '参数1', '参数2' );
$ss->handle();
//$request = file_get_contents( 'php://input' );
//file_put_contents( 'request.txt', $request );
class t{
 
	function __construct( $p1, $p2 ){
 
	}
 
	function im8( $g ){
		return 'OK----'. $g;
	}
 
}
?>

客户端代码:

<?php
$ss = new SoapClient( null, array( 'uri' => 'http://zendstudio.Net', 'location' => 'http://localhost/soap.php' ) );
$header = new SoapHeader( 'zendHeader', 'mmcYY', '12345678' );
$ss->__setSoapHeaders( $header );
echo $ss->im8( 'gently' );
 
?>

3、如何在php的soap客户端和服务端添加SoapHeader头

实际上,上面的例子已经实现了在客户端添加SoapHeader,而服务端的添加SoapHeader同样的简单,实例化一个SoapHeader,然后使用SoapServer的addSoapHeader方法添加进去即可,这个头一般是学习php soap的一个难点,通常我们做的最多的是用soap的方式和其他程序通信,用php如何构造soapheader显得有些不容易,以至于依赖于这个头的服务端总是返回不正确。

4、从php的服务端如何获取SoapHeader

这个大概就是很多人认为php对soap支持不完整的一个原因,目前的php版本无法直接获取SoapHeader,因此我想了一个笨方法,先通过使用php://input,获取所有POST上来的数据,然后使用正则表达式分离出SoapHeader的XML部分,然后再整理出想要的格式。

另外,在PHP的SoapServer端可以通过转存$_SERVER和上面讲到的php://input获取soap的“原始”通信内容。

| 13条评论 标签:  

13条评论
  1. lixiphp说道:

    终于抢到沙发了… 博主的主题!赞一个!!!

  2. 潇潇雨歇说道:

    给”龙之谷”做广告,拿了多少广告费呀,嘿嘿

  3. bingo说道:

    龙之谷?NND,战士转职转成战神,技能学错了。。悲剧。。。

  4. […] gently        入门级的讲讲soap这个php webservice             http://www.zendstudio.net/archives/php-webservice-soap/  […]

  5. MoHock说道:

    汗死。。。你也玩龙之谷啊

  6. sunsl说道:

    老大,支持你的网站,太崇拜你了!!

发表评论