기본원리 :
거시적인 관점에서는 프로토콜(SOAP 프로토콜) 기반의 웹 서비스이며, 미시적인 차원에서는 외부에 노출되는 응용 프로그램이며, 외부 프로그램에서 호출할 수 있습니다. web.을 통해 해당 API를 사용하면 dao 또는 mgr을 작성했습니다. 메소드를 호출하려면 일반적으로 클래스나 클래스의 인스턴스를 통해 Java 언어로 설명하고 클래스의 메소드를 호출합니다. 예:
Class UserMgr{
public void checkUser()
}, 호출하려면 Action에서 다음과 같이 할 수 있습니다(Struts가 클라이언트로 사용된다고 가정). 프로그램)
UserMgr um = new UserMgr();
um.checkUser();//여기에서 호출이 이루어집니다.
이제 UserMgr 클래스를 외부 세계(웹 서비스)에 노출하고 해당 클라이언트 프로그램(발신자/방문자 - 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입니다--- -Remote Procedure Call 프로토콜------진정한 상호 운용성을 달성할 수 있습니다. RPC는 세 부분으로 구성됩니다.
1.1 XML 및 XSD
똑똑한 사람들은 분명히 XML(Extensible Markup Language)을 생각할 것입니다. 이것은 진정한 크로스 플랫폼 데이터 형식입니다. XML은 데이터 표현 문제를 해결합니다. , 그러나 이 데이터 유형 세트를 확장하는 방법은 말할 것도 없고 표준 데이터 유형 세트가 여전히 부족합니다. 예를 들어 정수는 정확히 무엇을 나타냅니까? 16비트, 32비트, 64비트는 크로스 플랫폼에도 매우 중요합니다. W3C에서 개발한 XSD(XML Scheme)는 이 문제를 해결하기 위해 특별히 설계된 표준 집합입니다. 유형 - - 이는 모든 제조업체에서 지원해야 합니다. WebService는 WebService 표준을 준수하기 위해 특정 유형의 언어(.Net 또는 Java)를 사용하여 XSD를 사용합니다. 데이터 유형을 XSD 유형으로 변환해야 합니다. 일반적으로 말하면, 사용하는 도구는 이 표준 변환 작업을 완료하는 데 도움이 됩니다. 물론 직접 정의할 수도 있습니다.
1.2 SOAP
WebService를 구축한 후 클라이언트 프로그램은 이를 호출해야 합니다. SOAP(Simple Object Access Protocol)는 WebService를 호출하기 위한 표준 RPC 방법을 제공합니다. 실제로 SOAP는 약간 잘못된 이름입니다. C에서 WebService로 함수를 작성할 수 있으며 SOAP 사양은 SOAP 메시지의 형식을 정의합니다. SOAP를 사용하기 위해 HTTP 프로토콜을 통해 사용하는 방법. SOAP도 XML을 기반으로 하며 XSD는 SOAP의 데이터 인코딩 형식입니다. SOAP의 기본 구현 원리를 추측해 보겠습니다. Java를 예로 들어 서블릿 프로그램을 시작합니다. 이 서블릿은 네트워크(Http 프로토콜)에서 SOAP 개체를 허용합니다. WebService의 서블릿은 일반적인 HttpSerletRequest 객체입니다. 이 SOAP 객체에는 표준 XML 기반 데이터가 포함되어 있습니다. 그런 다음 서블릿이 가장 먼저 해야 할 일은 객체를 구문 분석하고 충분한 정보를 얻은 다음 해당 메소드를 호출하는 것입니다.
1.3 WSDL
귀하의 웹 서비스에 어떤 기능이 있는지 다른 사람들에게 어떻게 소개하시겠습니까? 그리고 각 함수가 호출될 때 매개변수는 어떻습니까? 문서를 작성하거나 WebService를 호출해야 하는 사람들에게 구두로 알릴 수 있습니다. 이러한 비공식적 방법의 심각한 문제는 해당 도구(예: Eclipse 또는 Visio Studio)가 수행 방법을 모르기 때문에 도움을 제공할 수 없다는 것입니다. WebService를 이해하려면 머신이 이해할 수 있는 문서를 사용하는 것이 WebService의 설명 언어(WSDL)와 같은 XML 기반 언어이기 때문입니다. xml 기반이므로 WSDL은 기계와 사람이 읽을 수 있습니다.
4. 목적:
시스템 통합, 시스템 간 데이터 교환, 분산 컴퓨팅 및 다양한 플랫폼의 상호 운용성. 직설적으로 말하면 C# 프로그램을 사용하여 .Net에서 Java 프로그램을 호출할 수 있습니다(요구 사항은 프로그램이 WebService를 기반으로 해야 함)
5. 실무 부분
Java를 예로 들어 보겠습니다. 모두 구체적으로 말하면 현재 WebService를 지원하는 프레임워크가 많이 있습니다(이러한 프레임워크는 몇 가지 기본 작업을 수행하므로 WebService 작성이 매우 편리해지며 이는 Hibernate와 JDBC 사용의 차이점과 동일합니다). 예를 들어 MyEclipse에 통합된 xFire 프레임워크는 현재 프레임워크의 개발 추진력이 매우 강력하고 Spring에 대한 지원도 매우 풍부합니다.
먼저 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中文网!