只用到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)服务端,先建立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();
} 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);
} }
需要特别说明的是,这里的setClass成员函数传入的业务逻辑类名称一定要和下面的业务逻辑类名称一致,不然会报非法控制器错误 建完controllers该建model了
//业务逻辑所在层,把所有需要提供的服务都可以放在这一层中
/modules/services/models/models/WapArticle.php
<?php
//预加载其他原来已实现的的业务逻辑或者数据库操作类
require_once realpath(APPLICATION_PATH).'/modules/news/models/FrontDbTable/Article.php'; class WapArticle{ /**
* getArticles ,operate database example
*
* @param Int $id
* @return String
*/
public function getArticle($id)
{
//直接实例化一个原来的数据库操作类
$dbtable = new News_Model_FrontDbTable_Article();
$s = $dbtable->getArticle($id); //这里可以把结果进行xml格式化或者json格式化,以方便其他客户端调用
$d = json_encode($s);
return $d;
} /**
* 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;
} }
?>
这里要特别说明的是: 我曾尝试让WapArticle类直接继承Zend_Db_Table_Abstract类,然后再在WapArticle类中直接对数据库表操作,没有成功,报出非法控制器错误,不知 如何解决,google了一下,好像网上也有类似的问题,不知是ZF本身的问题,还是说我没写对,有哪位大神路过的话,还望给指点一二 然后我又尝试使用Zend_Registry::get('db')获取数据库连接对象,也是为空,又失败,正当我一筹莫展时,突然想起尝试一下在该类中直接实例化一 个原来的的数据库表操作类试试(modules/news/models/FrontDbTable/Article.php),没想到还真成功了。不知道这个问题出在哪里!不过这样也好 。把这个层单独独立出来,只处理业务逻辑,数据库操作在另外一个层实现,倒实现了分离的目的,嘿嘿,算是无心插柳吧。 还有就是业务逻辑层的成员函数说明格式要注意,不然好像还会报出非法控制器错误(哎,啥都报这个错误,还让人活不。。。)
/**
* Adds method
*
* @param Int $param1
* @param Int $param2
* @return Int
*/
public function math_addx($param1, $param2) {
return $param1+$param2;
}
函数名称说明与函数参数说中间有一行空格
输入要采用"@param 参数类型 参数名"的格式
输入要采用"@return 参数类型"的格式 顺便也贴上/modules/news/models/FrontDbTable/Article.php的代码
class News_Model_FrontDbTable_Article extends Zend_Db_Table_Abstract
{
protected $_name = 'custom_article'; public function getArticle($id)
{
$id = (int)$id;
$where = array('id='.$id, 'isshow=1');
$row = $this->fetchRow($where);
if(!$row){
return 0;
}
return $row->toArray();
}
} 下面就是如何使用了
有三个地址
http://192.168.1.100/kktapp/public/services/wapsearch/index?wsdl显示该server的wsdl,uri其中对服务做了详细描述包括服务名称,服务的类 型,输入输出参数等
而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格式的数组 ----------------------------------------------------------------------------- 用java写了客户端,测试了一下,还行能调用 使用到了axis1.4代码如下 import org.apache.axis.client.Call;
import org.apache.axis.client.Service; public class Testserver { 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());
}
} }

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. LAMP环境安装实例

  2. 计算n^k的开头三位和末尾三位(fmod(double x,double y)函数的引入)

    C 库函数 double fmod(double x, double y) 返回 x 除以 y 的余数. 所以fmod(x,1)得到的就是小数部分的值(如fmod(3.35,1)==0.35) htt ...

  3. SQLite数据库学习小结——native层实现

    1. SQlite概述 SQLite是一款轻量.快速.跨平台的嵌入式数据库,是遵守ACID(注:ACID指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consi ...

  4. 通过Jersey客户端API调用REST风格的Web服务

    Jersey 客户端 API 基础 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client.Client 类的实例.下面是最简单的方法: i ...

  5. 通过torodb && hasura graphql 让mongodb 快速支持graphql api

    torodb 可以方便的将mongo 数据实时同步到pg,hasura graphql 可以方便的将pg 数据暴露为graphql api,集成在一起真的很方便 环境准备 docker-compose ...

  6. stenciljs 学习八 组件测试

    测试对于框架来说比较重要,对于web 组件的测试同样很重要,类似的jest 很方便,stenciljs也是基于jest 开发的 包含两个核心api render(), flush() 测试配置 pac ...

  7. task optimization

    Requirements: Tasks have Dependencies Running the task in Multi thread Links http://en.wikipedia.org ...

  8. svn 报错及解决

    报错: svn: E155015: One or more conflicts were produced while merging r68508:73308 into '[分支]' -- reso ...

  9. vs2010开发环境恢复--(mysql,数据文件可直接拷贝,并可用navicat直接管理)

    一.linq to mysql (DBLINQ) 1.安装mysql phpstudy2014,数据库文件可直接拷贝,在命令行中运行select version();查看版本为5.5.38 ,单独安装 ...

  10. Mongodb基础用法及查询操作

    插入多条测试数据> for(i=1;i<=1000;i++){... db.blog.insert({"title":i,"content":&qu ...