只用到zend_soap包中的Zend_Soap_Server,Zend_Soap_AutoDiscover和Zend_Soap_Client三个类

首先要注意ZF是调用php的soap扩展,所以请确认php.ini(;extension=php_soap.dll 去掉分号)中打开了soap扩展,同时注意配置php.ini中soap段的wsdl缓存,调试时请关闭该缓存,否则
修改model后无法查看效果。发布时可以把缓存打开。还有就是使用服务器套件的问题,我试过使用APMServ5.2.6,完全正确的代码,就是使用

Zend_Soap_Client时无法获取服务端提供的服务函数,最后改用wapmserver又没有问题,哎。。。

基本流程就是使用使用Zend_Soap_Server,Zend_Soap_AutoDiscover构建服务端,然后使用Zend_Soap_Client来调用服务端提供的功能

  1. 基本代码
    (1)服务端,先建立controller
    /modules/services/controllers/WapSearchControllers.php
    <?php
    //预加载model类
    require_once realpath(APPLICATION_PATH).'/modules/services/models/WapArticle.php';
    class Services_WapSearchController extends Zend_Controller_Action
    {
    private $_WSDL_URI = "http://192.168.1.100/kktapp/public/services/wapsearch/index?wsdl";
    private function handleWSDL() {
    $autodiscover = new Zend_Soap_AutoDiscover();
    //类名要注意一致
    $autodiscover->setClass('WapArticle');
    $autodiscover->handle();
    }
    private function handleSOAP() {
    $soap = new Zend_Soap_Server($this->_WSDL_URI);
    $soap->setClass('WapArticle');
    $soap->handle();
    }
    //不需要视图和layout,所以禁用之
    public function init(){
    $this->_helper->viewRenderer->setNoRender();
    $this->_helper->layout()->disableLayout();
    }
  2.  
  3. public function indexAction(){
    //判断请求中是否有wsdl有就自动生成wsdl的uri否则启动soap服务
    if(isset($_GET['wsdl'])) {
    $this->handleWSDL();
    } else {
    $this->handleSOAP();
    }
    }
    //客户端测试
    public function clientAction(){
    $client = new Zend_Soap_Client($this->_WSDL_URI);
    //调用服务端提供的服务
    $res = $client->getArticle(31);
    var_dump($res);
    }
  4.  
  5. }
    需要特别说明的是,这里的setClass成员函数传入的业务逻辑类名称一定要和下面的业务逻辑类名称一致,不然会报非法控制器错误
  6.  
  7. 建完controllers该建model
    //业务逻辑所在层,把所有需要提供的服务都可以放在这一层中
    /modules/services/models/models/WapArticle.php
    <?php
    //预加载其他原来已实现的的业务逻辑或者数据库操作类
    require_once realpath(APPLICATION_PATH).'/modules/news/models/FrontDbTable/Article.php';
  8.  
  9. class WapArticle{
  10.  
  11. /**
    * getArticles ,operate database example
    *
    * @param Int $id
    * @return String
    */
    public function getArticle($id)
    {
    //直接实例化一个原来的数据库操作类
    $dbtable = new News_Model_FrontDbTable_Article();
    $s = $dbtable->getArticle($id);
  12.  
  13. //这里可以把结果进行xml格式化或者json格式化,以方便其他客户端调用
    $d = json_encode($s);
    return $d;
    }
  14.  
  15. /**
    * Simple array sort
    *
    * @param Array $array
    * @return Array
    */
    public function simple_sort($array) {
    asort($array);
    return $array;
    }
    /**
    * Adds method
    *
    * @param Int $param1
    * @param Int $param2
    * @return Int
    */
    public function math_addx($param1, $param2) {
    return $param1+$param2;
    }
  16.  
  17. }
    ?>
    这里要特别说明的是:
  18.  
  19. 我曾尝试让WapArticle类直接继承Zend_Db_Table_Abstract类,然后再在WapArticle类中直接对数据库表操作,没有成功,报出非法控制器错误,不知
  20.  
  21. 如何解决,google了一下,好像网上也有类似的问题,不知是ZF本身的问题,还是说我没写对,有哪位大神路过的话,还望给指点一二
  22.  
  23. 然后我又尝试使用Zend_Registry::get('db')获取数据库连接对象,也是为空,又失败,正当我一筹莫展时,突然想起尝试一下在该类中直接实例化一
  24.  
  25. 个原来的的数据库表操作类试试(modules/news/models/FrontDbTable/Article.php),没想到还真成功了。不知道这个问题出在哪里!不过这样也好
  26.  
  27. 。把这个层单独独立出来,只处理业务逻辑,数据库操作在另外一个层实现,倒实现了分离的目的,嘿嘿,算是无心插柳吧。
  28.  
  29. 还有就是业务逻辑层的成员函数说明格式要注意,不然好像还会报出非法控制器错误(哎,啥都报这个错误,还让人活不。。。)
    /**
    * Adds method
    *
    * @param Int $param1
    * @param Int $param2
    * @return Int
    */
    public function math_addx($param1, $param2) {
    return $param1+$param2;
    }
    函数名称说明与函数参数说中间有一行空格
    输入要采用"@param 参数类型 参数名"的格式
    输入要采用"@return 参数类型"的格式
  30.  
  31. 顺便也贴上/modules/news/models/FrontDbTable/Article.php的代码
    class News_Model_FrontDbTable_Article extends Zend_Db_Table_Abstract
    {
    protected $_name = 'custom_article';
  32.  
  33. public function getArticle($id)
    {
    $id = (int)$id;
    $where = array('id='.$id, 'isshow=1');
    $row = $this->fetchRow($where);
    if(!$row){
    return 0;
    }
    return $row->toArray();
    }
    }
  34.  
  35. 下面就是如何使用了
    有三个地址
    http://192.168.1.100/kktapp/public/services/wapsearch/index?wsdl显示该server的wsdl,uri其中对服务做了详细描述包括服务名称,服务的类
  36.  
  37. 型,输入输出参数等
    http://192.168.1.100/kktapp/public/services/wapsearch/index则可查看服务是否正常运行
    一般出现如下界面就说明服务正常运行
    <?xml version="1.0" encoding="UTF-8" ?>
    - <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    - <SOAP-ENV:Body>
    - <SOAP-ENV:Fault>
    <faultcode>Sender</faultcode>
    <faultstring>Invalid XML</faultstring>
    </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    http://192.168.1.100/kktapp/public/services/wapsearch/client则是客户端测试,当然也可以使用其他客户端(如java,.net等)进行测试
    这里只测试了一个服务getArticle($id),数据库用户配置正确的话,应该返回一个json格式的数组
  38.  
  39. -----------------------------------------------------------------------------
  40.  
  41. java写了客户端,测试了一下,还行能调用
  42.  
  43. 使用到了axis1.4代码如下
  44.  
  45. import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
  46.  
  47. public class Testserver {
  48.  
  49. public static void main(String[] args) {
    try {
    String endpoint = "http://192.168.1.100/kktapp/public/services/wapsearch/index";
    Service service = new Service();
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress(endpoint);
    call.setOperationName("getArticle");
    int temp = 31;
    String result = (String) call.invoke(new Object[] { temp });
    System.out.println("result is " + result);
    }
    catch (Exception e) {
    System.err.println(e.toString());
    }
    }
  50.  
  51. }

zend_soap做webservice的使用方法的更多相关文章

  1. java 调用webservice的各种方法总结

    java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...

  2. WebService服务调用方法介绍

    1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 ...

  3. loadrunner做webservice接口之简单调用

    今天听大神讲了webservice做接口,我按照他大概讲的意思自己模拟实战了下,可能还有很多不对,一般使用webservice做接口,会使用到soapui,但是用了loadrunner以后发现lr很快 ...

  4. 关于webservice不支持方法重载的解决办法

    今天在写WebService时,出现了这样的错误: Count(Int32, Int32) 和 Count(Int32) 同时使用消息名称“Count”.使用 WebMethod 自定义特性的 Mes ...

  5. 使用 CXF 做 webservice 简单例子(转载)

    使用 CXF 做 webservice 简单例子     Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这 ...

  6. go-micro使用Consul做服务发现的方法和原理

    go-micro v4默认使用mdns做服务发现.不过也支持采用其它的服务发现中间件,因为多年来一直使用Consul做服务发现,为了方便和其它服务集成,所以还是选择了Consul.这篇文章将介绍go- ...

  7. C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处

    ​ 一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...

  8. cxf webservice 生成wsdl方法参数名称为arg0问题

    在通过cxf生成webservice服务时,如果你是用ServerFactoryBean,那么在生成wsdl时,方法的参数名称会被自动命名为arg0,arg1...,如: <xsd:comple ...

  9. 使用ssh正向连接、反向连接、做socks代理的方法

     ssh -L 219.143.16.157:58080:172.21.163.32:8080 用户名@localhost -p 10142  在 219.143.16.157机器执行   将ssh隧 ...

随机推荐

  1. POJ 2585:Window Pains(拓扑排序)

    Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2524   Accepted: 1284 Desc ...

  2. WC游记

    第一次来WC,感觉这种集训真吼啊 day0 火车上快速补习了莫队,和AC自动姬,AC自动姬以前就会写只不过太久没写忘了我会了= = 莫队只是学习了做法,还没有做过题…… 本来想再复习一下后缀数组,然后 ...

  3. sql serve 创建序列

    Oracle中有sequence的功能,SQL Server类似的功能使用Identity列实现,但是有很大的局限性. 在2012中,微软终于增加了 sequence 对象,功能和性能都有了很大的提高 ...

  4. j2ee使用struts实现用户的登陆及注冊

    用户名: 密码: <%-- 使用struts标签 --%> <%-- --%>

  5. PHP 的工作流组件记录

    我目前只知道在有审批流程中会用到工作流. 不过我我还没用过,还不知道怎么使用. 暂且先记录一下,目前我找到的几个 PHP 工作流组件. symfony https://github.com/symfo ...

  6. vue-cli 构建项目中 config/index.js 文件解读

    // see http://vuejs-templates.github.io/webpack for documentation. var path = require('path') module ...

  7. Apache Spark 内存管理详解

    在spark里面,内存管理有两块组成,一部分是JVM的堆内内存(on-heap memory),这部分内存是通过spark dirver参数executor-memory以及spark.executo ...

  8. java中String对象的存储位置

    public class Test { public static void main(String args[]) { String s1 = "Java"; String s2 ...

  9. 转 : jmeter分布式测试的坑

    有关jmeter分布式测试的环境配置,大概就是那样,但是每次想要进行jmeter分布式测试的时候,总是会有各种奇怪的问题,下面整理了一些可能遇到的坑. 只要错误中出现:Error in rconfig ...

  10. mySQL 教程 第4章 数据查询

    mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= ...