基本原則:
マクロの観点から見ると、これはプロトコル (SOAP プロトコル) に基づく Web サービスであり、ミクロレベルでは、外部プログラムが Web を通じてその API を呼び出すことができるアプリケーション プログラムです。前に書きましたが、dao または mgr のメソッドを呼び出す場合は、通常、クラスまたはクラスのインスタンスを渡してから、そのクラスのメソッドを呼び出す必要があります。例:
Class UserMgr{
public void checkUser();
} を呼び出したい場合は、アクション内でこれを実行できます (クライアント プログラムとして Struts が使用されていると仮定します)
UserMgr um = new UserMgr() ;
um.checkUser();//ここで呼び出しが行われることに注意してください。
あとは、この UserMgr クラスを外部 (Web サービス) に公開し、そのクライアント プログラム (呼び出し元/訪問者 - Web サービスをサポートできる限り、任意のプログラムにすることができます) を、たとえば C# で実行するだけです。 Java アプリケーションの API (メソッド) を呼び出すには、Add メソッドを使用します。
package com.zhuweisky.xfireDemo; public class MathService { public int Add(int a ,int b) { return a+b ; } }
考えるのが好きな人は必ず尋ねるでしょう、クロスプラットフォーム呼び出し (WebService) には必ずプロトコルが必要です。ここでのプロトコルはプラットフォームに依存しない RPC-----リモート プロシージャ コール プロトコル---- である可能性があります。本当に相互運用可能です。 RPC は 3 つの部分で構成されます。
1.1 XML と XSD
賢い人は間違いなく XML (Extensible Markup Language) を思い浮かべるでしょう。XML は真のクロスプラットフォーム データ形式です。XML はプラットフォームに依存せず、ベンダーに依存しないデータ表現の問題を解決します。データ型の標準セットが存在しないこと、ましてやこのデータ型セットを拡張する方法が存在しないことなどです。たとえば、整数は正確に何を表すのでしょうか。 16 ビット、32 ビット、64 ビット、これらはクロスプラットフォームにとっても非常に重要です。W3C によって開発された XML スキーム (XSD) は、この問題を解決するために特別に設計された一連の標準データを定義します。タイプ -- - WebService は、WebService 標準に準拠するために、特定の種類の言語 (.Net または Java) を使用してデータ型システムとして XSD を使用する必要があります。データ型を XSD 型に変換する必要があります。一般的に、使用するツールは、この標準的な変換作業を完了するのに役立ちます。もちろん、自分で定義することもできます。
1.2 SOAP
WebService を構築した後、クライアント プログラムはそれを呼び出す必要があります。Simple Object Access Protocol (SOAP) は、WebService を呼び出すための標準 RPC メソッドを提供します。実際、SOAP は、必ずしもオブジェクトである必要はありません。SOAP 仕様では、SOAP メッセージの形式を定義しており、WebService として関数を呼び出すことができます。 HTTP プロトコル経由で SOAP を使用する方法。 SOAP も XML に基づいており、XSD は SOAP のデータ エンコード形式です。 SOAP の基本的な実装原理を推測してみましょう。Java を例として、サーブレット プログラムを起動します。このサーブレットはネットワーク (HTTP プロトコル) 上で SOAP オブジェクトを受け入れます。 WebService のサーブレット。受け入れられるのは通常の HttpSerletRequest オブジェクトです。この SOAP オブジェクトには標準の XML ベースのデータが含まれます。次に、サーブレットが最初に行う必要があるのは、オブジェクトを解析し、十分な情報を取得して、対応するメソッドを呼び出すことです。
1.3 WSDL
あなたの Web サービスがどのような機能を持っているかを他の人にどのように紹介しますか?各関数が呼び出されるときのパラメータはどうなるでしょうか? WebService を呼び出す必要がある人に文書を書いたり、口頭で伝えたりすることもできますが、これらの非公式な方法の重大な問題は、ツール (Eclipse や Visio Studio など) がその方法を知らないため、何の助けも提供できないことです。 WebService を理解するための 1 つの解決策は、WebService の記述言語 (WSDL) が XML ベースの言語であるため、WebService とその関数、関数パラメーター、および戻り値を使用することです。 xml に基づいているため、WSDL はマシンと人間が読み取ることができます。
4. 目的:
システム統合、システム間のデータ交換、分散コンピューティング、および異なるプラットフォームの相互運用性。端的に言えば、C# プログラムを使用して .Net 上の Java プログラムを呼び出すことができます (プログラムが WebService に基づいていることが要件です)
5. 実践的な部分
Java を例に挙げると、まず、特別に述べられています。現在 WebService をサポートしているフレームワークはたくさんあります (これらのフレームワークはいくつかの基本的な作業を行うため、WebService を作成するのに非常に便利です。これは Hibernate と JDBC を使用する場合の違いと同じです)。ここでは xFire フレームワークを取り上げます。たとえば、MyEclipse に統合されています。現在、このフレームワークは非常に急速に開発されており、Spring のサポートも非常に充実しており、Axis など、WebService をサポートする同様のフレームワークが多数あります。
まず MyEclipse を使用して WebService プロジェクトを作成し、次にインターフェイスと実装クラス、
//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());
実装クラスを作成します:
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中文网!