首页 php教程 PHP开发 WebService原理

WebService原理

Dec 15, 2016 pm 03:23 PM

  基本原理: 
从宏观看,是基于协议(SOAP协议)的web 服务,从微观层面看,就是一个应用程序,暴露给外界,外界的程序可以通过web的方式来调用其API,我们以前写一个dao或者一个mgr,你要是想调用他的方法,用java语言来描述,通常是要通过或者类的实例,然后调用类的方法。比如说: 
Class UserMgr{ 
     public void checkUser(); 

},你要是想调用的话,可以通过这样,在你的Action里(假设通过Struts作为客户端程序) 
UserMgr um = new UserMgr(); 
um.checkUser();//注意,这里产生了调用。 
那么我们现在只要把这个UserMgr这个类暴露给外界(web Service),让其客户端程序(调用/访问 者-可以是任何程序,只要是它能支持WebService就可以),比如说,在c#的程序里要调用一个java应用程序的API(方法),这里是一个Add方法。 

package com.zhuweisky.xfireDemo; 
public class MathService 
{ 
    public int Add(int a ,int b) 
    { 
        return a+b ; 
    } 
}
登录后复制
 //C# 
                string url = "http://localhost:8080/XFireZhuweiTest/services/MathService" ; 
                object[] args ={1,2} ; 
                object result = ESFramework.WebService.WebServiceHelper.InvokeWebService(url ,"Add" ,args) ; 
                MessageBox.Show(result.ToString());
登录后复制

爱思考的人肯定会问了,这中跨平台之间的调用(WebService)肯定需要一个协议,这里的协议就是与平台无关的RPC-----远程过程调用协议-----它可以真正实现互操作。RPC由三部分组成的。
1.1 XML与XSD
聪明的人一定会想到XML(可扩展的标记语言),它是真正的跨平台的数据格式----平台无关和厂商无关,XML是解决了数据表示问题,但是还缺少了一套标准的数据类型,更没有说怎么样去扩展这套数据类型,例如,整形数到底表示什么?16位,32位,64位,这些对于跨平台来说也是非常重要的,W3C制定的XML Scheme(XSD)就是专门解决这个问题的提出一套标准,它定义了一套标准的数据类型---这个可是任何厂商都要支持的哦,WebService就是使用XSD作为数据类型系统的,当你使用某种类型的语言(.Net or Java)来构建某个WebService,为了符合WebService标准,你所有的数据类型都必须转换位XSD类型。一般来说你用的工具会帮你完整这个标准转换的工作。当然你也可以自己定义。
1.2 SOAP
你建好了一个WebService以后,客户端程序需要去调用,简单对象访问协议(SOAP)提供了标准的RPC方法来调用你的WebService。实际上,SOAP在这里有点用词不当,不一定是对象,你完全可以用C写一个函数作为一个WebService,任然可以通过SOAP进行调用,SOAP规范定义了SOAP消息的格式,以及怎样通过Http协议来使用SOAP。SOAP也是基于XML和XSD的,XML是SOAP的数据编码格式。我猜想一下SOAP的底层的实现原理,以java为例,启动一个Servlet程序,这个Servlet接受网络(Http协议)上的SOAP对象------------假设不是WebService的Servlet可能接受的就是普通HttpSerletRequest对象,这个SOAP对象是包含着标准的基于XML的数据。然后这个Servlet最先需要做的事情就是解析这个对象,获得足够多的信息然后调用对应的方法。
1.3 WSDL
你会怎么样向别人介绍你的web Service都有那些功能呢?以及每个函数调用时候的参数呢?你可能写一个文档或者口头告诉需要调用你的WebService的人,这些非正式的方法有一个严重的问题就是,他们的工具(比如Eclipse或者Visio Studio)不能提供任何的帮助,因为你的工具根本不了解你的WebService,一个解决的办法是用一个机器能认识的文档,WebService的一个描述语言(WSDL)就是这样一个基于XML的语言,用WebService以及其函数和函数的参数,返回值,因为这是基于xml的,所以WSDL是能够被机器阅读的,人也可以阅读,

4. 用途:
系统集成,系统间的数据交换,分布计算,不同平台的互操作。说白了,就是你可以在.Net上用C#程序调用Java的程序(要求是你的程序是基于WebService的)

5. 实战部分
以java为例,首先特别申明,目前支持WebService的框架有很多(这些框架做了一些基础的工作,使得你编写一个WebService非常地方便,和使用Hibernate和JDBC的区别一样),我们这里以集成在MyEclipse的xFire框架为例,目前这个框架的发展势头很,对Spring的支持也很充分,类似的支持WebService的框架还有很多,比如说axis。
先用MyEclipse建立一个WebService的工程,然后编写接口和实现类,

public interface IService { 

    public String testMethod(String testStr); 



}
登录后复制

实现类:

public class ECIWebservice implements IService { 



    public void putMessage(MessageInfo message, String authInfo) 

           throws UniediException { 

       // TODO Auto-generated method stub 



    } 



    public void putMessages(MessageInfo[] messages, String authInfo) 

           throws UniediException { 

       // TODO Auto-generated method stub 



    } 



    public MessageInfo getMessage(String appId, String orgCode, String authInfo) 

           throws UniediException { 

       // TODO Auto-generated method stub 

       return null; 

    } 



    public MessageInfo[] getMessages(String appId, String orgCode, 

           String authInfo, int count) throws UniediException { 

       // TODO Auto-generated method stub 

       return null; 

    } 



    public String testMethod(String testStr) { 

       System.out.println("&&&&&&&&&&&&&&&&&Hello: "+testStr+"******************"); 

       return "The para is "+testStr; 

       

    } 



}
登录后复制

建立一个WebService的工程,其实没有什么什么特别,仅仅是比普通的Tomcat工程多WebService.xml文件---这个时候的此文件啥内容都没有。

然后再建立一个WebService,这个时候会提示


默认会把当前所有的webService工程都列出来。选择其中一个,进入一下步:选择你的发布名字,以及要把那个API开放出去(接口和实现类,默认会把所有public的方法都开放出去)

点击完成。其实做这一步骤仅仅是为了修改webservice.xml文件。

请看修改后的文件内容:

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://xfire.codehaus.org/config/1.0"> 

    

    <service> 

       <name>testwebservice</name> 

       <serviceClass>com.webservice.test.IService</serviceClass> 

       <implementationClass> 

           com.webservice.test.ECIWebservice 

       </implementationClass> 

       <style>wrapped</style> 

       <use>literal</use> 

       <scope>application</scope> 

    </service></beans>
登录后复制

至此,一个WebService已经建立完成,发布到web容器上(Tomcat和jboss都是可以的)你可以有三种方式来测试。

第一种方式是:

利用MyEclipse自带的Web service explorer。

点击go以后。

点击bindings的link以后,就能看到binding了的所有方法,这些方法都是可以在这里调用的。


我们以一个简单的方法testMethod()作为测试使用。

看看执行后得效果:

第二种方法就是通过,使用浏览器的:

直接在浏览器的地址栏里输入:

http://localhost:8080/mywebservice/services/testwebservice?wsdl


应该可以看到一个XML文件(此文件就是描述文件WSDL)的内容,不过这里只摘写部分内容:

<xsd:element name="testMethod"> 

- <xsd:complexType> 

- <xsd:sequence> 

  <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string" /> 

  </xsd:sequence> 

  </xsd:complexType> 

  </xsd:element> 

- <xsd:element name="testMethodResponse"> 

- <xsd:complexType> 

- <xsd:sequence> 

  <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string" /> 

  </xsd:sequence> 

  </xsd:complexType> 

  </xsd:element> 

。。。。。 

<wsdl:message name="testMethodResponse"> 

  <wsdl:part name="parameters" element="tns:testMethodResponse" /> 

  </wsdl:message> 

。。。。。 

<wsdl:operation name="testMethod"> 

  <wsdl:input name="testMethodRequest" message="tns:testMethodRequest" /> 

  <wsdl:output name="testMethodResponse" message="tns:testMethodResponse" /> 

  </wsdl:operation> 

。。。。 

<wsdl:service name="testwebservice"> 

- <wsdl:port name="testwebserviceHttpPort" binding="tns:testwebserviceHttpBinding"> 

  <wsdlsoap:address location="http://localhost:8080/mywebservice/services/testwebservice" /> 

  </wsdl:port> 

  </wsdl:service>
登录后复制

能看到这部分内容也是说明你的WebService已经好了。


第三种方法就是编写一个客户端程序去测试,特别说明的是,这个客户端可以人适合程序,asp,VB.net, C#, 等

我们是使用了一个java的Application

public static void main(String[] args){ 

       IService is =null; 

       org.codehaus.xfire.service.Service srvcModel = new  ObjectServiceFactory().create(IService.class);  

       XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire()); 

          String helloWorldURL = "http://localhost:8080/mywebservice/services/testwebservice"; 

          try {         

              is = (IService)factory.create(srvcModel, helloWorldURL); 

              is.testMethod("zhangsan"); 

          }catch(Exception ex){ 

              

          } 



    }
登录后复制

程序顺利执行,其结果就在tomcat的控制台打印出来了我们想看到的内容了。这里需要特别说明的是,假如不用XFire框架,可是可以编写你自己的WebService的客户端程序的。或者使用了其他的框架(这里以Axis为例):

String endpoint = " http://localhost:8080/mywebservice/services/testwebservice"; 

              Service service = new Service(); 

              Call call = (Call)service.createCall(); 

              call.setTargetEndpointAddress(endpoint); 

call.setOperationName(new QName("urn: testwebservice ", "testMethod")); 

              String resultStr = ((String)call.invoke(new Object[]{theIntArray})); 

              System.out.println("result_int: " + resultStr);
登录后复制



更多WebService原理相关文章请关注PHP中文网!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)