你喜欢SOAP吗?反正我不喜欢!
叫什么Simple Object Access Protocol,实际上一点都不Simple!
说什么轻量级协议,从它基于XML的编码就知道它有多臃肿!
说什么跨平台特性,其实各个语言需要自己实现一整套SOAP!
除了给人看的接口文档外,还需要一份给机器看的wsdl,并且接口调用前要先载入它!
有人也许会说“wsdl是基于xml的,人也可以直接阅读啊,完全可以不需要接口文档!”
。。。那你说说你有几个项目是这么干的?尤其是外部合作的项目!
…………
唯一的好处就是调用者可以像本地一样调用远程函数,但这建立在复杂封装的基础上,一切都要标准协议,一定程度上意味着悲催的可控性和灵活性。
总之这种感觉就像从linux的开源天堂突然掉入MS的世界……
好吧,可能是我常年用PHP养成的土鳖习惯吧,高端的东西还真享受不了~
(我靠。。。谁拿拖鞋丢我?!)
---------------------------------------- 我是分割线 --------------------------------------------
吐槽完了,下面就说说这两天用PHP使用SOAP的感受吧~
其实PHP自带有soap扩展,但是。。。这是个略显坑爹的扩展。
SoapServer端没带生成wsdl的功能,需要使用工具(如Zend)或。。。手写 - -|||
虽然SoapClient端支持无wsdl的方式调用,但是。。。没有wsdl你打算给谁用?难不成自娱自乐么~
so,最后我还是用了第三方的包,没错,就是nusoap!
用它实现Server端,动态生成标准的wsdl地址;客户端倒是可以使用自带的soap扩展。
网上有一些简单的示例,不是过于简单,就是不完整,总之一些关键点经常没有提到,遇到的很多问题最后还是通过翻源码解决的。
完整的例子就不写了,这里仅对值得特别注意的地方做下mark(其他基础知识和简单范例请先自行google):
1、调用addComplexType创建复合类型
常用的有两种,一种是array类型(对应php里的索引数组),可以这么注册:
$server->wsdl->addComplexType(
'testParam', //复合参数名
'complexType',
'array', //这里说明是数组
'',
'', //基本约束
array(), //xsd:element
array(
'abc' => array('name'=>'abc', 'type'=>'xsd:string'),
'def' => array('name'=>'def', 'type'=>'xsd:int')
) //xsd:attribute
);
例如请求参数为该类型,则Client端可以这么调用:
//复合参数:testParam
//参数一:abc=linvo
//参数二:def=123
$ret = $client->myFun(array('linvo', '123'));
Server端可以这么接收参数:
function myFun($testParam){
$param1 = $testParam[0];
$param2 = $testParam[1];
return array($param1, $param2); //假设响应参数也为该类型
}
还有一种是struct类型(对应php里的哈希数组),可以这么注册:
$server->wsdl->addComplexType(
'testParam', //复合参数名
'complexType',
'struct', //这里说明是结构体
'all', //按照什么排序,有三个选择all(全部)|sequence(次序)|choice(选择)
'',
array(
'abc' => array('name'=>'abc', 'type'=>'xsd:string'),
'def' => array('name'=>'def', 'type'=>'xsd:int')
) //xsd:element
);
例如请求参数为该类型,则Client端可以这么调用:
//复合参数:testParam
//参数一:abc=linvo
//参数二:def=123
$ret = $client->myFun(array('abc'=>'linvo', 'def'=>'123'));
Server端可以这么接收参数:
function myFun($testParam){
$param1 = $testParam['abc'];
$param2 = $testParam['def'];
return array('abc'=>$param1, 'def'=>$param2); //假设响应参数也为该类型
}
注意:
无论哪种形式,均不用体现复合参数名,只是struct形式的复合参数中的二级参数需要体现参数名。这里如果搞错的话Client端可能会取到NULL。
当struct形式时,Client取到的结果为Object,如果想变为数组可以强制转换成数组。
2、中文问题
字符集问题不管在哪里,都让人烦躁&%¥!
如果你和我一样使用的是UTF-8,那么创建soap_server对象后,需要设置这两处的字符集:
$this->server->soap_defencoding = 'UTF-8';
$this->server->xml_encoding = 'UTF-8';
现在Clinet端接收到的响应正常了,可是传入Server端函数中的请求参数还是有问题!
通过调试发现Server获取到的原始请求数据($data=file_get_contents("php://input");)是正常的,只是经过soap处理($server->service($data))传入接口函数中就不对了,看了问题出在nusoap中。
翻源码一步步跟,看到nusoap貌似只支持三种字符集 ISO-8859-1|US-ASCII|UTF-8,还好我使用的是UTF-8
而且它内部默认是转成ISO-8859-1处理的!
在nusoap_parser类的nusoap_parser函数的第4个参数(我下载的版本:$Id: nusoap.php,v 1.123 2010/04/26 20:15:08 snichol Exp $,在6577行)是
@param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1
这个值默认是true,而且应该是从server对象传来的,那我把 $this->server->decode_utf8 = false; 后发现报错了貌似。。。看来这个参数不仅仅影响nusoap_parser
后来索性只把nusoap_parser处的设置为false:
6582行:$this->decode_utf8 = false;
终于OK了~!
你喜欢SOAP吗?反正我不喜欢!的更多相关文章
- docker(三)反正我不喜欢敲命令,daocloud.io管理你的docker,安装远程下载工具aria2 迅雷远程下载 xware
1.登录daocloud.io 2.寻找合适的镜像 3.查看镜像信息并部署,它给出了一个运行命令,其中有用的只是-V,目录映射,映射了物理服务器的/tddownload到容器的/xware/tddow ...
- <<你最喜欢做什么--兴趣问题清单>>总结
二.测试作业 你最喜欢做什么--兴趣问题清单 •根据迄今为止已有的经历,你真正喜欢从事的工作是什么? 目前还没有接触工作,就工作而言,凭自己所学的本领和技术去工作,我认为我会喜欢我所做的工作 •休 ...
- 最喜欢的VS 键盘快捷键摘抄
最喜欢的Visual Studio键盘快捷键(关闭) 336年最喜欢的 425年 你最喜欢的Visual Studio键盘快捷键是什么? 我总是让我的手在键盘上,远离鼠标! 一个请每回答. net ...
- 【转载】javascript 杂谈之哪种写法你更喜欢?
转载自:http://www.cnblogs.com/baochuan/archive/2012/04/30/2473771.html 思维导图 介绍 老是在写js,你平时是怎么写你的js呢?更 ...
- 我喜欢的程序语言c++
我喜欢的程序语言c++我喜欢的程序语言c++
- English trip V1 - B 20. Likes and Dislikes 喜欢和不喜欢 Teacher:Sole Key:
In this lesson you will learn to talk about likes and dislikes. 课上内容(Lesson) # talk about hobby Do y ...
- Java 程序员最喜欢使用的日常工具
多年来,Java 始终是企业应用程序的支柱.最近几年,Java 也是 Android 开发的首选编程语言.不过开发人员如何使用这种语言呢?一项新的研究阐明了主要使用 Java 的开发人员的工作类型,以 ...
- “猜你喜欢”的背后揭秘--10分钟教你用Python打造推荐系统
欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 话说,最近的瓜实在有点多,从我科校友李雨桐怒锤某男.陈羽凡吸毒被捕.蒋劲夫家暴的三连瓜,到不知知网翟博士,再到邓紫棋解约蜂鸟.王思聪花千芳隔 ...
- Nginx、SSL双向认证、PHP、SOAP、Webservice、https
本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是 ...
随机推荐
- iOS实战(零):开发社区、文档等资源
社区 Apple官方资源 Xcode文档库: Window->Documentation and API Reference (可以在xcode的Preferences中下载最新的文档) iOS ...
- 五毛的cocos2d-x学习笔记06-处理用户交互
前几篇感觉自己在写教育文章,╮(╯▽╰)╭.今天换成开发者的口吻,毕竟我也是在边学边写博客. 处理用户交互包括:单点触摸.多点触摸.事件传递.传感器.物理按键等部分. 单点触摸: 触摸事件传递顺序 o ...
- PHP学习笔记12-上传文件
上传图片文件并在页面上显示出图片 enctype介绍:enctype属性指定将数据发回到服务器时浏览器使用的编码类型. 取值说明: multipart/form-data: 窗体数据被编码为一条消息, ...
- python自学笔记(二)python基本数据类型之字符串处理
一.数据类型的组成分3部分:身份.类型.值 身份:id方法来看它的唯一标识符,内存地址靠这个查看 类型:type方法查看 值:数据项 二.常用基本数据类型 int 整型 boolean 布尔型 str ...
- selenium 学习笔记 ---新手学习记录(10) 问题总结(java)--poi--excel 操作
1.当我使用poi想要操作xlsx时,报错,解决方法下载xmlbeans-2.6.0.jar架包,引入即可.点我下载 https://yunpan.cn/cSdVqp6e4v6Jk 访问密码 2c5 ...
- rhApp遇到的项目问题
1.如果有多人同时操作一个桌台的情况下,如何处理: 2.index页面点击清空的时候是否要把桌台一起清掉: 3.账单界面已结账的小单背景色是否需要和未结账的不同:
- python+opencv
$cd numpy $ sudo python setup.py build $ sudo python setup.py installRunning from numpy source direc ...
- Google Play和基于Feature的过滤
田海立@CSDN 翻译自Google Play and Feature-Based Filtering GooglePlay会过滤出那些对用户可见的应用程序,因此用户只能看到和下载那些与他们的设备兼容 ...
- SpringMVC静态文件(图片)访问+js访问 简单小例子
项目文件布局: web.xml文件: <?xml version="1.0" encoding="UTF-8"?> <web-app vers ...
- C# Best Practices - Creating Good Properties
Coding Properties Code in the Getter Check the user's credentials Check application state Format the ...