转自:http://www.cnblogs.com/smallmuda/archive/2010/10/12/1848700.html

感谢作者分享

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

extension=php_openssl.dll

extension=php_soap.dll

php.ini 这2项要开通

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("http://localhost: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
返回值:
一个简单类型的返回值,或是一个关联数组
例子:

<?php
 
$client = new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);
 
$client->__soapCall("SomeFunction",
                     array($a, $b, $c)
                     );
$client->__soapCall("SomeFunction", 
                    array($a, $b, $c), 
                    NULL,
                    new SoapHeader(), 
                    $output_headers
                    );
 
 
$client = new SoapClient(null, array('location' =>"http://localhost/soap.php",'uri'=> "http://test-uri/"));
$client->SomeFunction($a, $b, $c);
$client->__soapCall("SomeFunction", 
                    array($a, $b, $c)
                    );
$client->__soapCall("SomeFunction", 
                    array($a, $b, $c),
                    array('soapaction' => 'some_action','uri' => 'some_uri')
                    );
?>

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: “http://211.186.5.15/Service/ServiceMethod”

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ServiceMethod xmlns="http://211.186.5.15/Service">
      <param1>string</param1>
      <param2>string</param2>
      <param3>string</param3>
    </ServiceMethod>
  </soap:Body>
</soap:Envelope>

调用方法:

<?php
$client = new SoapClient("http://www.xxx.com/service/service.asmx?WSDL");
//向SOAP服务方发送参数值
$param1 = "p1";
$param2 = "p2";
$param3 = "p3";
 
//serviceParam1,serviceParam2,serviceParam3为发送参数值所对应的参数名(或service端提供的字段名)
$param = array('serviceParam1' => $param1,'serviceParam2' =>$param2,'serviceParam3' => $param3);
 
//默认以parameters字段标示传递的参数数组(这里的web services是.net提供的,所以和php提供的Web service不同)
$arr = $client->__soapCall('ServiceMethod',array('parameters' => $param));
//这里淡水推荐直接使用web services提供的方法,如
//$arr = $client->ServiceMethod($param);
 
print_r($arr);
?>

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

</param4>
</ServiceMethodSection>
</ns1:ServiceMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

调用方法:

<?php
//传递一个参数
try {
      $client = new SoapClient(
                      null,
                      array('location' =>'http://192.168.1.180:8088/services/SoapPage?WSDL','uri' =>'http://192.168.1.180:8088/services/')
                      );    
      $result =  $client->__soapCall('ServiceMethod', array('fieldName' =>"data")); //以数组形式传递params 
      //$result =  $client->__soapCall('ServiceMethod', array(new SoapParam("data", 'fieldName')));  //以构造服务端参数的形式构造参数传递给服务端  
      var_dump($result);
  } 
  catch (Exception $e) 
  {
      printf("Message = %s",$e->__toString());
  }
?>

附注一下:
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
参数名

;
      }
 
    $struct = new Obj();  //创建服务端要求传递的对象
    //如果服务端变态到传递的参数有的参数类型是你编程语言中没有的数据类型,
    //如php,没有Java的Long类型(一般web service考虑通用性,数据类型都是string或int型)
    //就要将参数进行强制类型转换
    //这样的处理也只是在SOAP传输中将xml的参数类型替换成服务端所要求的类型名
    //并不是真实转化传递的数据类型
    $struct->param1 = iconv('gb2312','utf-8',$struct->param1);
    $struct->param2 = new SoapVar($struct->param2,XSD_LONG);
    $struct->param3 = new SoapVar($struct->param3,XSD_LONG);
    $struct->param4 = new SoapVar($struct->param4,XSD_LONG);
 
    //序列化对象中使用SoapVar的方法参考php手册对SoapVar的解释,每个参数都解释的很清楚
    $soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "ServiceObjectType","http://soapinterop.org/xsd"); //对象序列化,注意区分,SOAP对象的序列化不是用serialize
    
      $result =  $client-> ServiceMethod(new SoapParam($soapstruct,'ServiceMethodSection')); 
     //$result =  $client->__soapCall('ServiceMethod', array(new SoapParam($soapstruct, 'ServiceMethodSection')));
     
      var_dump($result);
  } catch (Exception $e) {
      printf("Message = %s",$e->__toString());
  }

?>

php5调用web service (笔者测试成功)的更多相关文章

  1. php5调用web service

    工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经 ...

  2. 工作笔记 | Visual Studio 调用 Web Service

    引言 最近笔者负责ERP财务系统跟中粮集团财务公司的财务系统做对接,鉴于ERP系统中应付结算单结算量比较大,而且管理相对集中,ERP系统与中粮财务公司的支付平台系统对接,实现银企直联,将网银录入的环节 ...

  3. ref:Web Service 渗透测试从入门到精通

    ref:https://www.anquanke.com/post/id/85910 Web Service 渗透测试从入门到精通 发布时间:2017-04-18 14:26:54 译文声明:本文是翻 ...

  4. SOAP调用Web Service

    SOAP调用Web Service (示例位置:光盘\code\ch07\ WebAppClient\ JsService4.htm) <html xmlns="http://www. ...

  5. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  6. C#开发和调用Web Service

    http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...

  7. ASP.NET调用Web Service

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  8. C# 调用 Web Service

    Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP ...

  9. 基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service

    引言 前段时间一直在做一个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿.现在想将业务逻辑层以下部分和界面层分离,使用Web Service来做.由于C#中通过直接添加引用的方来调用 ...

随机推荐

  1. LSP“浏览器劫持概念

    关于Winsock LSP“浏览器劫持”,中招者一直高居不下,由于其特殊性,直接删除而不恢复LSP的正常状态很可能会导致无法上网所以对其修复需慎重.   先说说什么是Winsock LSP“浏览器劫持 ...

  2. 使用Cookie保存商品浏览记录

    数据流程:页面上是商品列表,点击<a href="productServlet">商品名</a> ==>跳转到自定义的servlet中进行处理,先得到 ...

  3. VBS创建数据库

    '创建数据库'参数:strDBPath 字符串型 数据库文件的完整路径Sub CreateDataBase(strDBPath)Dim catObjSet catObj = CreateObject( ...

  4. PHP超时处理全面总结(转)

    [ 概述 ] 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面 ...

  5. Android IOS WebRTC 音视频开发总结(三二)-- WebRTC项目开发建议

    本文主要介绍WEBRTC开发过程中的一些现象,文章来自博客园RTC.Blacker,支持原创,欢迎关注微信公众号blacker,更多详见www.rtc.help 随着移动互联网和智能硬件的快速发展,音 ...

  6. 对于返回void类型的asyc的异步方法,如何修改,能使用await

    下面是使用WebClinet 获取百度首页的html代码,一般的写法如下: private void Button_Click(object sender, RoutedEventArgs e) { ...

  7. Android应用源码安卓短信拦截木马项目源码

    温馨提示:本资源由源码天堂整理提供下载转载时请留下链接说明:http://code.662p.com/view/9174.html安卓短信拦截木马源码主要功能就是开机后台启动,拦截本机收到的短信并且转 ...

  8. 在网页中使用H1标记的须注意的事项

    H1标签是网站排名非常重要的一个因素,因此我们一定要正确使用它. 本文为你介绍H1标签使用的七大注意事项: 1.每个页面都应该有H1标签,H1标签是每个网页不可缺少的要素. 2.使用H1标签的内容应该 ...

  9. POJ C++程序设计 编程题#2 魔兽世界之二:装备

    编程题#2: 魔兽世界之二:装备 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB ...

  10. Permission Lists Assigned to a User

    SQL that I find useful in many occasions. It will return a list of permissions that are assigned to ...