我玩的应用:

|
最近因为项目需要,采用了WEBSERVICE方式,互相访问数据,所以就想到SOAP和REST这两种方式去解决问题;
不过由于客户只提供SOAP方式,所以不得不放弃轻跳的REST,采用比较老式的SOAP,说到SOAP大家都应该知道PHP5之后有自带的SOAP扩展,这里我就不多讲如何开启SOAP扩展了(自个百度一下~~)!还有一种NUSOAP,老外写的开源类,不过最近几年程序都没有更新过,所以有点过时,有些东西都无法去满足现有需求了(如果谁有能力可以尝试去改写一下,我是没有时间)!
在这里我给大家分享一下,此次在项目中采用的方式和碰到的居多问题;此分享讲解一下:PHP->PHP API 和 PHP->JAVA API;
1. PHP->PHP API
这个很简单,需要注意的不太多,都属于PHP内部的;看如下代码:
#PHP服务端代码:
- <?php
- function userRegister($username) {
- return 'test+'.$username;
- }
- $server = new SoapServer("user.wsdl");
- $server->addFunction("userRegister");
- $server->handle();
- ?>
复制代码 注意:这里有个WSDL文件,我采用的是Myeclipse生成,也可以使用zend生成,生成之后需要调整几个地方(如下)
a.命名空间需要定义
b.Message体需要从 element=\"tns:userRegister\" 为 type=\"xsd:string\" 不然就没有办法获取到返回值;-
- <wsdl:message name="userRegisterRequest">
- <wsdl:part name="parameters" type="xsd:string"/>
- </wsdl:message>
- <wsdl:message name="userRegisterResponse">
- <wsdl:part name="parameters" type="xsd:string"/>
- </wsdl:message>
-
复制代码 #PHP客户端代码:
- /* 调用PHP端API */
- $client = new SoapClient(\'http://dev.test.com/api/apiserver.php?wsdl\',
- array( \'trace\' => true, \'exceptions\' => true ) );
- var_dump( $client->__getFunctions() );
- var_dump( $client->__getTypes() );
- $result = $client->__call(\'userRegister\', array(\'miikeytest\'));
- var_dump($result);
复制代码 2. PHP->JAVA API
这个问题最需要注意了,JAVA和.NET对于类型,传参都很严格,PHP又是弱类型,所以这个时候需要委屈一下PHP,去遵守JAVA的类型限定:
本案例中采用Apache的CFX,作为发布JAVA端webservice,CFX不熟悉的可以去了解了解!WSDL都是由它直接生成的,比PHP的方便多了!
#JAVA服务端代码
#主启动程序
- package test;
- import org.apache.cxf.endpoint.Server;
- import org.apache.cxf.interceptor.LoggingInInterceptor;
- import org.apache.cxf.interceptor.LoggingOutInterceptor;
- import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
- public class MainService {
- public static void main(String[] args) {
- JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
- factory.setServiceClass(HelloWorldImpl.class);//这里有个实现类
- factory.setAddress(\"http://192.168.1.18:8080/HelloWorld\");
- factory.getInInterceptors().add(new LoggingInInterceptor());
- factory.getOutInterceptors().add(new LoggingOutInterceptor());
-
- Server server = factory.create();
- server.start();
- }
- }
- /* 实现类 */
- package test;
- import javax.jws.WebService;
- @WebService
- public class HelloWorldImpl implements HelloWorld {
- public String sayHello(String name) {
- System.out.println(\"SayHello is called\");
- return \"Hello miikey , your name is \" + name;
- }
- }
复制代码 #PHP客户端调用代码
- /* 调用JAVA端API */
- $client = new SoapClient(\'http://192.168.1.18:8080/HelloWorld?wsdl\',
- array( \'trace\' => true, \'exceptions\' => true ) );
- var_dump( $client->__getFunctions() );
- var_dump( $c->__getTypes() );
- $arr = array(\'name\' => \'miikeytest\');
- $result = $client->__call(\'sayHello\', array(\'parameters\' => $arr));
- var_dump($result);
复制代码 注意:这里的parameters是WSDL生成的Message体里的一个name值,java端就是通过这个name值包含了WSDL里的type(参数类型)name传入到服务端;所以一定要注意,可能看到这里有些看不大明白,那就需要你对WSDL结构很了解了!下面简单的提一下:
WSDL 是一种用于描述Web服务的语法规范,针对每个Web服务来说,它是一个说明文档,对web服务的位置,协议和接口进行详细的说明.由web服务的开发者提供。
WSDL文件包括5部分:types, Message,PortType,Binding和Service五部分.
1 Types定义: 类型定义,独立于语言.对应于SOAP消息中要传输的元素信息的定义
2 Message: 每个web方法对应两个message定义in和out.而message的定义包含了头和体
3 PortType: 每个web service对应一个PortType,该PortType中又包含了对其发布的方法, operation(操作)
4 Bindings: 指定每porttype中每个操作(类以及方法)的绑定信息,包含input和output的消息的格式.
5 Service: 每个web service绑定的port信息
Web 服务除过按照前述的示例形式发布外,还可以通过 WSDL 文档来发布。
好了今天写的有些乱,如果有不明白的 可以直接找我;一起研究;
如有更新可以及时跟进我的个人博客:http://www.miikey.com/posts/view.html?pid=706
接下来我会稍后整理一下关于PHP里实现REST架构的分享,目前这个用的比较多,比较灵活;淘宝API、新浪API、QQ的OPENSNSAPI、校内等等都是采用RESTFUL架构模式,有空的朋友 可以去一起研究研究;毕竟REST在PHP上运用的还不是很成熟呢!
from:http://bbs.phpchina.com/thread-196520-1-1.html |
|