设为首页收藏本站
开启辅助访问
切换到宽版

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索
查看: 4755|回复: 0
打印 上一主题 下一主题

采用PHP5自带SOAP扩展实现接口开发实例以及常见问题

[复制链接]

我玩的应用:

跳转到指定楼层
楼主
发表于 2012-10-21 01:25:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近因为项目需要,采用了WEBSERVICE方式,互相访问数据,所以就想到SOAP和REST这两种方式去解决问题;
  不过由于客户只提供SOAP方式,所以不得不放弃轻跳的REST,采用比较老式的SOAP,说到SOAP大家都应该知道PHP5之后有自带的SOAP扩展,这里我就不多讲如何开启SOAP扩展了(自个百度一下~~)!还有一种NUSOAP,老外写的开源类,不过最近几年程序都没有更新过,所以有点过时,有些东西都无法去满足现有需求了(如果谁有能力可以尝试去改写一下,我是没有时间)!
  
  在这里我给大家分享一下,此次在项目中采用的方式和碰到的居多问题;此分享讲解一下:PHP->PHP API 和 PHP->JAVA API;
  1. PHP->PHP API
  这个很简单,需要注意的不太多,都属于PHP内部的;看如下代码:
  #PHP服务端代码:

  1. <?php
  2. function userRegister($username) {
  3.     return 'test+'.$username;
  4. }

  5. $server = new SoapServer("user.wsdl");
  6. $server->addFunction("userRegister");
  7. $server->handle();
  8. ?>

复制代码
注意:这里有个WSDL文件,我采用的是Myeclipse生成,也可以使用zend生成,生成之后需要调整几个地方(如下)
  a.命名空间需要定义
  
  
  b.Message体需要从 element=\"tns:userRegister\" 为 type=\"xsd:string\" 不然就没有办法获取到返回值;
  1.    
  2.   <wsdl:message name="userRegisterRequest">
  3.     <wsdl:part name="parameters" type="xsd:string"/>
  4.   </wsdl:message>
  5.   <wsdl:message name="userRegisterResponse">
  6.     <wsdl:part name="parameters" type="xsd:string"/>
  7.   </wsdl:message>
  8.   
复制代码
#PHP客户端代码:

  1. /* 调用PHP端API */
  2. $client = new SoapClient(\'http://dev.test.com/api/apiserver.php?wsdl\',
  3.         array( \'trace\' => true, \'exceptions\' => true ) );

  4. var_dump( $client->__getFunctions() );
  5. var_dump( $client->__getTypes() );
  6. $result = $client->__call(\'userRegister\', array(\'miikeytest\'));
  7. var_dump($result);
复制代码
2. PHP->JAVA API
   这个问题最需要注意了,JAVA和.NET对于类型,传参都很严格,PHP又是弱类型,所以这个时候需要委屈一下PHP,去遵守JAVA的类型限定:
   本案例中采用Apache的CFX,作为发布JAVA端webservice,CFX不熟悉的可以去了解了解!WSDL都是由它直接生成的,比PHP的方便多了!
   #JAVA服务端代码
   #主启动程序

  1. package test;

  2.     import org.apache.cxf.endpoint.Server;
  3.     import org.apache.cxf.interceptor.LoggingInInterceptor;
  4.     import org.apache.cxf.interceptor.LoggingOutInterceptor;
  5.     import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

  6.     public class MainService {

  7.         public static void main(String[] args) {
  8.             JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
  9.             factory.setServiceClass(HelloWorldImpl.class);//这里有个实现类
  10.             factory.setAddress(\"http://192.168.1.18:8080/HelloWorld\");
  11.             factory.getInInterceptors().add(new LoggingInInterceptor());
  12.             factory.getOutInterceptors().add(new LoggingOutInterceptor());
  13.             
  14.             Server server = factory.create();
  15.             server.start();
  16.         }

  17.     }

  18.     /* 实现类 */
  19.     package test;

  20.     import javax.jws.WebService;

  21.     @WebService
  22.     public class HelloWorldImpl implements HelloWorld {

  23.         public String sayHello(String name) {
  24.             System.out.println(\"SayHello is called\");
  25.             return \"Hello miikey , your name is \" + name;
  26.         }

  27.     }
复制代码
#PHP客户端调用代码

  1. /* 调用JAVA端API */
  2. $client = new SoapClient(\'http://192.168.1.18:8080/HelloWorld?wsdl\',
  3.         array( \'trace\' => true, \'exceptions\' => true ) );

  4. var_dump( $client->__getFunctions() );
  5. var_dump( $c->__getTypes() );
  6. $arr = array(\'name\' => \'miikeytest\');
  7. $result = $client->__call(\'sayHello\', array(\'parameters\' => $arr));
  8. 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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-9-22 06:50 , Processed in 0.162419 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表