PHP webservice 的初接触

webservice 现在是开始流行了,很多业务开启了这个功能。去年接触的一个金融类的项目有类似功能调用。当时没放心思研究,最两天试着接触了下,还真不错的。起步其实挺简单。

服务端的代码

server.php

<?php
class PassPort {

    /**
     * 打招呼
     * @param string $name
     */
    public function hello($name) {
        return 'Hello '. $name. ' !<br />';
    }

    /**
     * 求和
     * @param int $a
     * @param int $b
     * @return int
     */
    public function add($a, $b) {
        return $a + $b;
    }
    
    /**
     * 再见了
     */
    public function say() {
        return 'GoodBye!<br />';
    }
}

首先需要有个 wsdl 文件。两种方法生成,一个是借助 SoapDiscovery.class.php 类生成,这个需要从网上找下。

include 'server.php';//服务类的定义文件
include 'SoapDiscovery.class.php';

//第一个参数为类的名字,这里是 Api 也是生成的wsdl的文件的名字,第二个参数是服务的名字可以自己自由定义
$wsdl = new SoapDiscovery('Api', 'service');
$wsdl->getWSDL();

还有一种方法是通过 ZendStudio 生成,这个其实也很简单。可能有人找不到添加 wsdl ,那就说明你没有安装这个插件。点Help=》Welcome 然后选中 WSDL,会重启一次。 

新建的时候 tagert namespace 填写自己项目的访问地址 就可以基本不用改。生成之后需要改些东西。

TestSoapSoap下面填写php webService 如soapservice.php
NewOperation:添加方法。WebService里需要提供给别人调用的方法名
input :设置输入参数名和类型
output:设置返回值。
Add part:如果在input里添加,就是添加多个参数
set Type / set Element: 设置参数的input/output类型Type包含常见的数据类型(int,string,boolean,float,time…),Element就是自定义元素类型。

注意一点,右侧的那些方法都是自己手动 通过 New Operation 来添加的,还有里面的参数。关于参数和返回有点需要注意的,可以没有参数,但是需要有返回,没有返回客户端不知道处理结果啊,我是这么想的,必须要有返回。

这个时候看这好像完成了,其实没有,因为只有第一个方法(默认会有一个)是存在的,其他的都没有。需要点下中间的那个类似复选框的东西,然后在下面的界面点 Generate Binding Content 然后才可以正常用,否则会出现类似下面的提示错误。

xxx is not a valid method for this service

接下来就是写客户端的调用了 client.php。

<?php
ini_set('soap.wsdl_cache_enabled', 0);
ini_set('display_errors', 1);
error_reporting(E_ALL);//错误显示级别

$client = new SoapClient('soap.wsdl');
echo $client->hello('wayne');
echo 'The result is:', $client->add(7, 8), '<br />';
echo $client->say();
unset($client);

这里要提下,出现 xxx is not a valid method for this service 这样的提示,还有个可能就是你的服务端的方法改了,但是soap存在缓存,默认是打开的。linux环境下是 /tmp 目录下,调试过程中可以设置关闭缓存。使用语句  ini_set('soap.wsdl_cache_enabled', 0);来关闭。

最后通过浏览器访问 client.php 就可以看到想要的结果了。

Hello wayne !
The result is:15
GoodBye!

好了,到这里,初步接触就结束了。其实实例化SoapServer SoapClient 对象的时候,还有好多参数,我现在的是 server.php 和 client.php 都在通一个目录下。不存在url,之类的路径问题。接下来就要关注这个了。

原文地址:https://www.cnblogs.com/wayne173/p/5917538.html