php5调用web service

网络整理 - 08-28

  工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经包含了处理soap的模块,但是资料太少了,上php官网上查帮助,写的不是很容易理解,经过多次实践,终于搞清楚了,php调用web service还是非常简单的。下面用一个例子说明:

  web service服务是一个用java写的简单服务,环境为Tomcat6.0 + Axis2,暴露的方法为 String hello(String name)

  传递一个String参数name,然后返回给客户端。

  使用php5开发客户端:

以下为引用的内容:

<?php

header("content-type:text/html;charset=utf-8");

try {

    //$client = new SoapClient("HelloService.wsdl",array('encoding'=>'UTF-8'));

    $client = new SoapClient(":8080/axis2/services/HelloService?wsdl",array('encoding'=>'UTF-8'));

  var_dump($client->__getFunctions());

  print("<br/>");

  var_dump($client->__getTypes());

  print("<br/>");

  

 $parm1 = "php client call";

 $param = array('param0' => $parm1);

 $arr = $client->hello($param);

 print_r($arr); 

} catch (SOAPFault $e) {

    print $e;

}

?>

  代码确实很简单吧,创建SoapClient对象时,可以使用保存在本地WSDL文件,也可以使用远程的地址,后面的array数组里可以带上很多的参数,具体参数可以查php的SoapClient帮助,这里带的是字符集编码,如果调用方法的参数里有中文,一定要指定字符集编码,否则会出错。

  调用web service前可以先调用SoapClient的__geunctions()和__getTypes()方法看一下你要调用的web service暴露的方法,参数和数据类型,需要注意的是传入的参数名一定要和soapclient里面定义的一致,否则参数是传不过去的。(本人在这个上面延误了很长时间 c#调用不用指定参数名,真奇怪啊)

  不知道WSDL的情况也可以调用WS,需要使用SoapClient的__soapCall()或__call()方法,具体使用方法可以查php的帮助文档。

  另外发现个问题,如果web service方法返回的是xml格式的字符串,php接收到以后会自己把数据内容解析出来,而不是xml字符串.

  有个叫Nusoap类,在php4下比较流行。但是淡水这次玩的是php5,所以他就没戏了。

  先恶补一下相关知识。

  先要打开php5的web service扩展。linux下,嗯,好像不会-_-!。windows下,把php.ini文件中 extension=php_soap.dll 去掉注释即可。

  方法:

    SoapClient->__soapCall()
    说明:
class SoapClient {
mixed __soapCall ( string function_name, array arguments [, array options [, mixed input_headers [, array &output_headers]]])
}
In WSDL mode, you can simply call SOAP functions as SoapClient methods. This method useful in non-WSDL mode when soapaction is unknown, uri differs from the default or when sending and/or receiving SOAP Headers
  返回值:
  一个简单类型的返回值,或是一个关联数组
例子:

以下为引用的内容:

  1.in WSDL mode

  soapCall应用web service,例子用的是asp.net的web service,提供service.asmx页面,调用及查看都比较简单,手册上的example也大多是这个类型,比较简单.

  SOAP发送的协议:

  POST /servicepath/service.asmx HTTP/1.1

  Host: 211.186.1.4

  Content-Type: text/xml; charset=utf-8

  Content-Length: length

  SOAPAction: “”

以下为引用的内容:

      调用方法:

以下为引用的内容:

  2.in non-WSDL mode

  这种情况下soapaction is unknown

  SOAP发送协议:

  POST /services/SoapMethod?WSDL HTTP/1.1

  Host: 220.211.1.12:8088

  Connection: Keep-Alive

  User-Agent: PHP-SOAP/5.2.5

  Content-Type: text/xml; charset=utf-8

  SOAPAction: “urn:SoapMethod#ServiceMethod”

  Content-Length: 1297

以下为引用的内容:

       调用方法:

以下为引用的内容:

  附注一下:

  class SoapParam {

  __construct ( mixed data, string name )

  }

  参数:

  data

  The data to pass or return. You can pass this parameter directly as PHP value, but in this case it will be named as paramN and the SOAP Service may not understand it.

  name

  参数名

以下为引用的内容:

?>