一、什么是webService?
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
几个基本概念:
SOAP:简单对象存取协议,是webService的通信协议,是针对xml文档形式的调用方法的规范,可支持不同的底层接口,如http;
WSDL:是一个xml文档, 用于说明一组soap消息,以及如何交换这些消息;
UDDI:是一个主要针对Web服务供应商和使用者的新项目,是一种根据wsdl文件(描述文档)来引导客户端查找响应服务的机制。它是利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
一言以蔽之:webService是一种典型,成熟的远程服务调用技术规范。如网站对天气预报接口的接入,对列车时刻表、航班的接口接入等。
二、服务端简单示例
1)服务端服务接口模拟
看之前网上的示例,都是一个接口服务对应一个wsdl文件的,然而我考虑到:如果会有不止一个接口呢?该咋办?——其实,当然我可以一个接口实现类对应一个wsdl文件,并且也测试过没问题,但现在我想要发布多个接口服务,但只生成一个wsdl文件。
实现这种效果很简单,只需用一个实现类,该实现类同时实现若干个接口即可。但这样会造成耦合(下面就来测试这种,具体应用中,一般是某一类服务对应于一个接口,此时还是要用到一个接口对应一个wsdl文件的模式。)
接口一:
@WebService public interface IService { public void sayHello(@WebParam(name="username") String name); public int calculatr(int m, int n); }
接口二:
@WebService public interface IService2 { public void getInfo(@WebParam(name="person") Person person); }
其中,Person类是一个pojo,
public class Person implements Serializable{//因为要用于远程传输,所以需要序列化 private static final long serialVersionUID = 1L; private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Pserson [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } }
接口的实现类(这里我测试2个接口对应1个实现类,即生成一个wsdl文件,但现实中可能并不推荐这么做。。)
@WebService //注意:实现类要有该注解,才能被发布 public class MutiServiceImpl implements IService, IService2 { @Override public void getInfo(Person person) { System.out.println("该人员的信息:" + person); } @Override public void sayHello(String name) { System.out.println("Hello, my name is " + name); } @Override public int calculatr(int m, int n) { return m * n; } }
服务端接口服务的发布:
public class ServicePublish { public static void main(String[] args) { String address = "http://localhost:9001/Service/service"; //address由自己来指定 不过要符合规范 http://ip地址:端口/服务名/具体服务 //第二个参数必须是具体实现类 Endpoint.publish(address, new MutiServiceImpl()); System.out.println("webService之服务端服务发布成功!"); } }
运行main方法,可以看到打印信息,说明接口服务发布成功!(其实测试webService不是非得建立web project,普通的工程即可~~)
我们不妨在浏览器上输入刚刚发布的地址:http://localhost:9001/Service/service?wsdl(要加上?wsdl),即可看到一个自动生成的xml格式的描述文件:
This XML file does not appear to have any style information associated with it. The document tree is shown below. <!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --> <!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://the_service/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://the_service/" name="MutiServiceImplService"> <types> <xsd:schema> <xsd:import namespace="http://the_service/" schemaLocation="http://localhost:9001/Service/service1?xsd=1"/> </xsd:schema> </types> <message name="getInfo"> <part name="parameters" element="tns:getInfo"/> </message> <message name="getInfoResponse"> <part name="parameters" element="tns:getInfoResponse"/> </message> <message name="sayHello"> <part name="parameters" element="tns:sayHello"/> </message> <message name="sayHelloResponse"> <part name="parameters" element="tns:sayHelloResponse"/> </message> <message name="calculatr"> <part name="parameters" element="tns:calculatr"/> </message> <message name="calculatrResponse"> <part name="parameters" element="tns:calculatrResponse"/> </message> <portType name="MutiServiceImpl"> <operation name="getInfo"> <input wsam:Action="http://the_service/MutiServiceImpl/getInfoRequest" message="tns:getInfo"/> <output wsam:Action="http://the_service/MutiServiceImpl/getInfoResponse" message="tns:getInfoResponse"/> </operation> <operation name="sayHello"> <input wsam:Action="http://the_service/MutiServiceImpl/sayHelloRequest" message="tns:sayHello"/> <output wsam:Action="http://the_service/MutiServiceImpl/sayHelloResponse" message="tns:sayHelloResponse"/> </operation> <operation name="calculatr"> <input wsam:Action="http://the_service/MutiServiceImpl/calculatrRequest" message="tns:calculatr"/> <output wsam:Action="http://the_service/MutiServiceImpl/calculatrResponse" message="tns:calculatrResponse"/> </operation> </portType> <binding name="MutiServiceImplPortBinding" type="tns:MutiServiceImpl"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="getInfo"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="sayHello"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="calculatr"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="MutiServiceImplService"> <port name="MutiServiceImplPort" binding="tns:MutiServiceImplPortBinding"> <soap:address location="http://localhost:9001/Service/service1"/> </port> </service> </definitions>
这里顺便简单讲一下这个wsdl文件的一些关键字段 。
1)definitions元素——wsdl文件的根元素
2)type元素——作为一容器,定义了自定义的特殊数据类型,在声明消息部分(有效负载)的时候,messages定义使用了types元素中定义的数据类型与元素。
3)Message元素描述了Web服务的有效负载。相当于函数调用中的参数和返回值。
4)PortType元素定义了Web服务的抽象接口,它可以由一个或者多个operation元素,每个operation元素定义了一个RPC样式或者文档样式的Web服务方法,相当于类接口的名称。
5)Operation元素要用一个或者多个messages消息来定义它的输入、输出以及错误,相当于接口中包含的函数。
6)Binding元素将一个抽象的portType映射到一组具体的协议(SOAP或者HTTP)、消息传递样式(RPC或者document)以及编码样式(literal或者SOAP encoding)。
7)Service元素包含一个或者多个Port元素,每个Port元素对应于一个web服务
三、客户端简单示例(开另一个工程,不一定是web工程)
生成了wsdl文件之后,我们就需要根据该wsdl文件【自动】生成客户端的调用代码了。
一般而言,使用Jdk1.6+自带的命令会比较简单。(前提是你已配置好jdk环境变量)
具体命令格式为:
wsimport -s "src目录" -p “生成类所在包名” -keep “wsdl发布地址”
在本例中,为 wsimport -s E:\xxx\the_client\src -p org.webservice.client -keep http://localhost:9001/Service/service?wsdl (因为服务端和客户端都在同一台机器,所以直接用localhost,如果不是同一台机器,则客户端需要准确输入服务端的地址)
成功执行完命令之后,刷新会发现多了如下类:
接下来,我们就开始远程调用测试了:
public class ClientSub { public static void main(String[] args) { try { MutiServiceImpl impl = new MutiServiceImplService().getMutiServiceImplPort(); int x = impl.calculatr(30, 2); System.out.println("计算结果:" + x); Person person = new Person(); person.setAge(23); person.setGender("男"); person.setName("Karl"); impl.getInfo(person); impl.sayHello("Connor"); } catch (Exception e) { e.printStackTrace(); } } }
运行该服务的订阅类,会发现分别在服务端和客户端的控制台打印如下:
服务端:
客户端:
说明:利用webService来进行远程调用接口服务成功!
相关推荐
在这个用例中,我们将探讨如何使微信小程序与.NET开发的Webservice进行数据交互。 首先,我们需要了解微信小程序的基本结构。微信小程序由JSON配置文件(app.json)、页面配置文件(page.json)、WXML(微信小程序...
在本例中,“webservice的一个测试例子”是一个用于学习和日后参考的实例,它可能包含了创建和调用Web服务的基本步骤。 首先,让我们深入了解一下Web服务的工作原理。Web服务通过使用XML来描述数据,这样任何能够...
使用CXF的`@WebService`注解标记服务接口和实现类,定义服务契约和行为。例如: ```java @WebService public interface MyWebService { String sayHello(String name); } @Component @WebService(endpoint...
这里提到的"webservice测试工具类"和"源码"提供了方便的测试手段,帮助开发者快速检查和调试WebService接口。 WebService是一种基于XML的开放标准,它允许不同平台上的应用之间通过HTTP协议交换数据。常见的...
根据提供的文件信息,本文将详细解释一个简单的 WebService 示例,并深入探讨其中的关键概念和技术细节。 ### 一、WebService 概念 #### 1.1 WebService 定义 WebService 是一种支持通过网络进行调用的服务形式,...
其主要特点包括无状态、简单高效、易于理解和实现。HTTP接口通常采用REST(Representational State Transfer)架构风格,通过HTTP方法(如GET、POST、PUT、DELETE等)来操作资源,具有良好的可扩展性和跨平台性。 ...
通过这个项目,你可以深入理解WebService的工作原理,并且实际操作如何创建、部署和使用一个简单的WebService。同时,结合数据库的使用,你可以看到数据在服务中的流动,以及如何通过WebService实现系统的数据共享和...
简单的webservice发布和调用 初学者可以看看
这个简单的例子展示了如何使用JAX-WS和Tomcat创建和部署一个基础的Web服务。在实际项目中,你可能需要处理更复杂的交互、错误处理、安全性设置等。通过理解这些基本概念,你可以进一步扩展Web服务的功能,以满足不同...
总的来说,"简易WebService测试工具(WebServiceStudio)"是开发和维护过程中不可或缺的辅助工具,它让测试和调试WebService变得简单而高效。无论是初学者还是经验丰富的开发者,都能利用其便捷的功能,提高开发效率...
它可以轻松地创建、执行和监控Webservice测试用例,帮助开发人员和测试人员快速发现并解决Webservice中存在的问题。 #### 四、SAP Webservice通过SOAPUI的测试步骤 根据给定的业务背景——“新建WEBSERVICE需要...
【Webservice 设计和模式详解】 Webservice 是一种基于互联网的通信协议,旨在打破平台间的障碍,实现跨系统、跨平台的应用协同。随着其广泛应用,理解Webservice的设计原则和模式对于构建高效、可靠且安全的系统至...
1. **SOAP(简单对象访问协议)**:是WebService的数据传输协议,以XML格式封装数据,确保了跨语言和跨平台的兼容性。 2. **WSDL(Web服务描述语言)**:定义了WebService的接口,描述了如何调用服务、参数类型、...
Webservice是一种基于网络的服务接口,它允许不同系统之间进行数据交换和交互。核心概念在于,Webservice提供了一种标准化的方式,让应用程序能够通过互联网互相通信,就像调用本地函数一样。这种服务通常采用SOAP...
在Java世界中,WebService是一种基于XML的开放标准技术,它允许不同系统间的应用程序进行通信,跨越不同的操作系统和编程语言。本实例将详细讲解如何使用Apache Axis1.4工具来生成Java版的WebService服务端和客户端...
5. **可扩展性强**:WebService的设计使其容易与其他现有系统和服务集成,也方便未来添加新的功能和服务。 6. **标准化**:使用WSDL(Web Services Description Language)、SOAP(Simple Object Access Protocol)...
WebService测试是软件开发过程中的重要环节,特别是在.NET框架下进行Web服务开发时,验证服务功能、性能和稳定性显得尤为重要。Postman是一款广受欢迎的API测试工具,但它并非唯一的选择。本篇文章将探讨一种比...
例如,使用System.ServiceModel.Channels.Binding和System.ServiceModel.ChannelFactory可以创建一个到WebService的通道,并进行调用: ```csharp var binding = new BasicHttpBinding(); var endpointAddress = ...
本篇文章将详细讲解如何在C++中调用WebService,包括静态和动态方式,并探讨相关的源码实现。 首先,让我们理解什么是WebService。WebService是一种基于XML的开放标准,允许不同平台和应用程序之间进行互操作。它...
WebService的核心技术包括XML(可扩展标记语言)、WSDL(Web服务描述语言)和SOAP(简单对象访问协议)。在Java领域,Apache Axis是常用的WebService客户端和服务端实现工具。 【AxisWebService服务】 Apache Axis...