php webservice是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php webservice是啥相关的知识,希望对你有一定的参考价值。

一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银行服务器上。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。
其实可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。

至于php嘛, 就是一门动态的脚本语言, 无需和webservice画上勾
参考技术A soap 相比nusoap来说,优势之一是用c开发并编译成php内部函数库,而NuSOAP 完全由PHP语言编写,由一系列PHP 类组成。优势之二,nusoap是很早以前就有的,从2005-07-27 之后就停止更新了,而Soap在php5版本新增,随着php6对webservice的支持,我相信soap这个函数库的地位肯定会不断上升。

php5的Soap 函数库使用起来很方便,wsdl可以使用zend Development Environment 开发工具生成。
注意几点问题 :
1. 为了提高效率,php对 wsdl文件提供了缓存功能,开发的时候可以将使用ini_set("soap.wsdl_cache_enabled", 0); 让其失效,因为开发过程经常要修改wsdl文件;

2. SOAP(Simple Object Access Protocol) 简单对象访问协议,在php5不仅仅可以提供对象setClass给远程访问调用,还可以提供方法addFunctions。所以SOAP中的 'O' 已经被扩展了 。

3. 服务端有可能取不到客户端POST过来的数据,这可能是php5 soap functions的bugs;解决办法在下文的服务端举例程序中有一段代码:
if (isset($HTTP_RAW_POST_DATA))
$request = $HTTP_RAW_POST_DATA;
else
$request = file_get_contents('php://input');

下面是举例程序源代码。

soap客户端举例:

<?php

ini_set("soap.wsdl_cache_enabled", 0);
try
$soap = new SoapClient('authenticate/idolol.wsdl');
$soap->get_avatar(230);
$functions = $soap->__getFunctions();
print_r($functions);
$types = $soap->__getTypes();
print_r($types);
catch(SoapFault $fault)
trigger_error("SOAP Fault: (faultcode: $fault->faultcode, faultstring: $fault->faultstring)", E_USER_ERROR);


?>

soap 服务端举例:

<?php

require './soap_functions.php';

ini_set("soap.wsdl_cache_enabled", 0);

$server = new SoapServer('authenticate/idolol.wsdl',array('encoding'=>'UTF-8'));
$server->addFunction(array("user_login","session_log","get_avatar","emergency"));
//$server->addFunction(SOAP_FUNCTIONS_ALL);

if (isset($HTTP_RAW_POST_DATA))
$request = $HTTP_RAW_POST_DATA;
else
$request = file_get_contents('php://input');


if ($_SERVER["REQUEST_METHOD"] == "POST")
$server->handle($request);

else

echo "This SOAP server can handle following functions: ";

$functions = $server->getFunctions();
foreach($functions as $k=>$func)
echo $k.". ".$func . "\n";



?>
参考技术B webservice即WEB服务,是一个基于SOAP的规范。PHP WEBSERVICE 即是PHP语言实现的WEB服务。

调用webservice每次传进的参数都为null,请教是啥原因

参考技术A 建议方法:
1.尝试楼下的说法,在服务端打断点看下返回值是否是期望值
2.xfire
客户端对于数组等复杂对象会放到一个树形的结构中,直接获取会打印null,需要通过
Element
element
=
xmlTree.getDocumentElement();
来获取遍历,如果和spring集成的话,可以再配置文件中用配置文件代替

以上是关于php webservice是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用webserver的时候直接返回一个json的数据

WebServic调用天气预报服务

CXF 简单创建Webserver 例子

关于在VS2010中调用Webservic遇到的异常

如何在调用WebService方法时,传递对象数组参数

.net调用webservers 提示无法连接远程服务器啥原因