Heim  >  Artikel  >  php教程  >  WebService-Prinzip

WebService-Prinzip

高洛峰
高洛峰Original
2016-12-15 15:23:491291Durchsuche

Grundprinzip:
Aus Makrosicht handelt es sich um einen Webdienst, der auf dem Protokoll (SOAP-Protokoll) basiert. Auf Mikroebene handelt es sich um ein Anwendungsprogramm, das der Außenwelt ausgesetzt ist und von externen Programmen aufgerufen werden kann seine API über das Web. Wir haben früher ein Dao oder einen MGR geschrieben. Wenn Sie seine Methode aufrufen möchten, beschreiben Sie sie in der Regel über eine Instanz der Klasse oder Klasse und rufen Sie dann die Methode der Klasse auf. Zum Beispiel:
Class UserMgr{
public void checkUser();

}, wenn Sie es aufrufen möchten, können Sie es in Ihrer Aktion so machen (vorausgesetzt, Struts wird als Client verwendet). program)
UserMgr um = new UserMgr();
um.checkUser();//Beachten Sie, dass hier ein Aufruf erfolgt.
Jetzt müssen wir nur noch die UserMgr-Klasse der Außenwelt (Webdienst) zugänglich machen und ihr Client-Programm (Aufrufer/Besucher – kann jedes Programm sein, solange es WebService unterstützen kann) beispielsweise in C# freigeben. Das Programm muss die API (Methode) einer Java-Anwendung aufrufen. Hier ist eine Add-Methode.

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());

Menschen, die gerne denken, werden auf jeden Fall fragen: Der plattformübergreifende Aufruf (WebService) erfordert definitiv ein Protokoll, und das Protokoll hier ist plattformunabhängiger RPC ---- -Remote Procedure Call Protokoll ----- Es kann wirklich Interoperabilität erreichen. RPC besteht aus drei Teilen.
1.1 XML und XSD
Kluge Leute werden definitiv an XML (Extensible Markup Language) denken. Es ist ein wirklich plattformübergreifendes Datenformat – XML löst das Problem der Datendarstellung , aber es fehlt immer noch ein Standardsatz an Datentypen, geschweige denn, wie dieser Satz an Datentypen erweitert werden kann. Was genau stellt beispielsweise eine Ganzzahl dar? 16-Bit, 32-Bit, 64-Bit, diese sind auch für die plattformübergreifende Nutzung sehr wichtig. Das vom W3C entwickelte XML-Schema (XSD) ist eine Reihe von Standards, die speziell zur Lösung dieses Problems entwickelt wurden Typen – Dies muss von jedem Hersteller unterstützt werden. WebService verwendet XSD als Datentypsystem. Wenn Sie einen bestimmten Sprachtyp (.Net oder Java) verwenden, um den WebService-Standard einzuhalten Ihre Datentypen müssen in XSD-Typen konvertiert werden. Im Allgemeinen hilft Ihnen das von Ihnen verwendete Tool bei der Durchführung dieser Standardkonvertierungsarbeiten. Natürlich können Sie es auch selbst definieren.
1.2 SOAP
Nachdem Sie einen WebService erstellt haben, muss das Client-Programm ihn aufrufen. Das Simple Object Access Protocol (SOAP) stellt Standard-RPC-Methoden zum Aufrufen Ihres WebService bereit. Tatsächlich ist SOAP hier eine etwas falsche Bezeichnung. Es handelt sich nicht unbedingt um ein Objekt. Sie können eine Funktion in C als WebService schreiben, und sie kann dennoch über SOAP aufgerufen werden wie man es über das HTTP-Protokoll verwendet, um SOAP zu verwenden. SOAP basiert ebenfalls auf XML und XSD XML ist das Datenkodierungsformat von SOAP. Lassen Sie mich das zugrunde liegende Implementierungsprinzip von SOAP erraten. Starten Sie am Beispiel von Java ein Servlet-Programm. Dieses Servlet akzeptiert SOAP-Objekte im Netzwerk (Http-Protokoll). Servlet von WebService. Akzeptiert wird ein normales HttpSerletRequest-Objekt. Dieses SOAP-Objekt enthält standardmäßige XML-basierte Daten. Dann muss das Servlet zunächst das Objekt analysieren, genügend Informationen abrufen und dann die entsprechende Methode aufrufen.
1.3 WSDL
Wie würden Sie anderen vorstellen, welche Funktionen Ihr Webdienst hat? Und was ist mit den Parametern, wenn jede Funktion aufgerufen wird? Sie können ein Dokument schreiben oder den Leuten mündlich mitteilen, dass sie Ihren WebService aufrufen müssen. Ein ernstes Problem bei diesen informellen Methoden besteht darin, dass ihre Tools (wie Eclipse oder Visio Studio) keine Hilfe leisten können, weil Ihre Tools nicht wissen, wie das geht Um Ihren WebService zu verstehen, besteht eine Lösung darin, ein Dokument zu verwenden, das die Maschine verstehen kann. Eine solche XML-basierte Sprache ist die Verwendung von WebService und seinen Funktionsparametern und Rückgabewerten Basierend auf XML, sodass WSDL von Maschinen und Menschen gelesen werden kann,

4. Zweck:
Systemintegration, Datenaustausch zwischen Systemen, verteiltes Rechnen und Interoperabilität verschiedener Plattformen. Um es ganz klar auszudrücken: Sie können C#-Programme verwenden, um Java-Programme in .Net aufzurufen (Voraussetzung ist, dass Ihr Programm auf WebService basiert)

5 Praktischer Teil
Nehmen wir zunächst Java als Beispiel Alle geben ausdrücklich an, dass es derzeit viele Frameworks gibt, die WebService unterstützen (diese Frameworks erledigen einige grundlegende Arbeiten, sodass Sie einen WebService sehr bequem schreiben können, was dem Unterschied zwischen der Verwendung von Hibernate und JDBC entspricht). Das in MyEclipse integrierte xFire-Framework ist derzeit sehr stark und die Unterstützung für Spring ist ebenfalls sehr umfassend. Es gibt viele ähnliche Frameworks, die WebService unterstützen.
Verwenden Sie zuerst MyEclipse, um ein WebService-Projekt zu erstellen, und schreiben Sie dann die Schnittstelle und die Implementierungsklasse,

public interface IService { 

    public String testMethod(String testStr); 



}

Implementierungsklasse:

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中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn