WebService入门
来源:互联网 发布:带手写笔的平板 知乎 编辑:程序博客网 时间:2024/05/17 23:08
简介:WebService是一种面向服务的架构技术,通过标准的Web协议提供服务,目的是保证不同平台的应 用服务可以互操作。从表面上看,Webservice 就是一个应用程序,它向外界暴露出一个能够通过W eb进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。 说白了,如果 我们是汽车制造商的话,制造汽车需要零件,但是我们自己并不生产零件,而零件是由零件供应商 提供。那WebService就相当于这里的零件供应商,它不但为我们提供服务,还为很多汽车制造商提 供服务。那我们只需要按照和零件供应商的协议拿到零件制造汽车就可以啦。
作用:
1、让任何平台上的用任何语言编写的服务进行交互。
2、将应用程序功能概念化成任务,从而形成面向任务的开发和工作流。这使得更抽象的软件能够为工作在业务层面具有较少软件分析技术的用户所用。
3、允许松耦合,这意味着,每当其中某个或多个服务在设计或实现中发生改变时,服务应用程序之 间的交互不会因此而中断。
4、使现有的应用程序能适应不断变化的业务条件和客户需求。
5、向现有或遗留软件应用程序提供服务接口,而无需改变原来的应用程序,从而使这些应用程序完 全可以运行在这种服务环境下。
6、引入其他一些与原有功能无关的管理或操作管理功能,比如可靠性、责任性和安全性等等,从而在业务计算环境中增加其通用性和实用性。
实现原理
SOAP协议
SOAP提供传输数据的标准方式,充当在服务提供方和服务请求方之间激活服务的消息交换服务。
SOAP由下列元素组成:
SOAP Envelope:描述消息、标识内容和信封的处理信息。
SOAP Transport:定义HTTP 和 SMTP 等底层传输协议的绑定。
SOAP Encoding:定义将应用程序特定的数据类型的实例映射为XML元素的一组编码规则。
SOAP RPC约定:定义RPC请求和响应的表现形式。这些SOAP 请求和响应被作为一种数据类型编组并 传递到SOAP消息正文中。
SOAP协议的范本
请求:
响应:
注:SOAP = 在HTTP的基础上+XML数据
WSDL:(Web ServicesDescription Language,Web 服务描述语言)是基于XML模式的规范,用于将Web服 务描述为操作集,并将数据输入/输出参数描述为消息。WSDL还定义使用绑定机制将任何传输协议、 数据格式或结构附加到抽象消息、操作或终端的通信模型。
作用:说明服务在哪里,如何调用,其实就是一个使用说明书
总结:Web Service好比一个服务供应商,给其他厂家提供基础服务,其他厂家再将这个服务包装成自己的 产品或者服务提供给别人或自己使用。有点像OEM了。既然两个公司需要合作,不可能靠一句话就 可以的,就需要一些标准和规范的东西来实现。那么:
SOAP 就像两个公司之间签的合同,约束双方按一定规矩和标准办事。
WSDL 则像说明书,告诉别人你有什么,能给别人提供什么服务。
WebService和Web服务器的区别
WebService看作是Web服务器上应用;反过来说,Web服务器是WebService运行时所必需的容器。这就是它们的区别和联系。
入门程序
注:JAVA的JDK1.6.0_21以后的版本才支持webservice
调用webservice的几种方式:
一、使用wsimport命令,生成本地代码(JDK)
1、编写服务类
//通过@WebService注解类将该类发布成webservice@WebServicepublic class HelloWorld {public String sayHello(){System.out.println("服务已经被调用了。。。");return "Hello World!";}public static void main(String[] args) {//1 创建HelloWorld类的对象HelloWorld hw = new HelloWorld();//通过Endpoint端点服务类的publish(address,implementor)方法发布//address:绑定发布服务的地址+服务名;implementor:指定要发布服务的具体类Endpoint.publish("http://192.168.1.100:8888/helloworld", hw);//发布的web服务是独立线程,打印信息System.out.println("服务已经发布成功。。。");}}
2、使用JDK的wsimport生成本地调用代码
wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.wsimport.exe位于JAVA_HOME\bin目录下.
常用参数为:
• -d<目录> - 将生成.class文件。默认参数。
• -s<目录> -将生成.java文件。
• -p<生成的新包名> -将生成的类,放于指定的包下。
• (wsdlurl) – http://server:port/server?wsdl,必须的参数。
示例:
• C:/> wsimport –s . http://127.0.0.1:8888/helloworld?wsdl
• 注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。
• 如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。
• .class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。
• C:/> wsimport –s . –p cn.ws http://127.0.0.1:8888/helloworld?wsdl
• 注意:-p参数后面是要更改后的包名
生成之后的代码(将java文件拷贝到项目中)
3、测试调用
public class test {public static void main(String[] args) {//得到一个web服务的对象(名称一般为服务类加上service)HelloWorldService hws = new HelloWorldService();HelloWorld hw = hws.getHelloWorldPort();String say = hw.sayHello();System.out.println("调用结果:"+say);}}
二、使用service类来调用webservice(JDK)
1、将wsimport分析出来的接口类导入myeclipse的工程里
2、将报错的地方删除
3、编写测试类
public class test {
public static void main(String[] args)throws Exception {
//1 获取WSDL文件的地址
URL url = new URL("http://192.168.1.100:8888/helloworld?wsdl");
String namespace = "http://service.app/";
//2 创建一个service类的对象
Service service = Service.create(url, new QName(namespace,"HelloWorldService"));
//3 service类的对象提供了一个getPort()方法,返回对应webservice接口类的对象HelloWorld hw = service.getPort(new QName(namespace,"HelloWorldPort"), HelloWorld.class);
//4调用服务方法
String say = hw.sayHello();
System.out.println("say ="+say);
}
}
三、前端调用:页面(Ajax)(SOAP协议的内容或格式)
<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body><!--点击测试触发事件--><button onclick="helloworld()">测试</button></body><script type="text/javascript">var xhr = ajaxFunction();function helloworld(){var url = "http://192.168.1.100:8888/helloworld?wsdl";<!--请求soap协议的拼串-->var soap = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'"+" xmlns:q0='http://service.app/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'"+" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><soapenv:Body>"+"<q0:sayHello /></soapenv:Body></soapenv:Envelope>"; xhr.open("post",url,true); xhr.onreadystatechange = _back; xhr.setRequestHeader("Content-Type","text/xml;charset=utf-8"); <!--发送协议--> xhr.send(soap);}function _back(){if(xhr.readyState==4){if(xhr.status==200){var docXml = xhr.responseXML;<!--获取响应soap协议中的<return>标签的内容就是返回值-->var result = docXml.getElementsByTagName("return")[0].text;}}}function ajaxFunction(){var xmlHttp;try{ // Firefox, Opera 8.0+, SafarixmlHttp=new XMLHttpRequest();} catch (e){ try{// Internet Explorer xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e){ try{ xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } catch (e){} } }return xmlHttp;}</script></html>
四、URLConnection来调用webservice(移动端)
- 【WebService】WebService入门1
- WebService入门
- webservice入门
- WebService入门
- webservice 入门
- WebService入门
- WebService入门
- webService入门
- Webservice 入门
- WebService入门
- WebService入门
- WebService 入门
- WebService入门
- webService 入门
- WebService入门
- WebService入门
- WebService 入门
- webService 入门
- GetModuleHandle与GetModuleHandleEx
- ios 读取数据库中的图片方法
- Android Animation动画相关
- CF 191 div2 C
- JavaScript第一天的笔记,我只记我觉得重要的。。。
- WebService入门
- android thread handler
- Mongodb数据库集群分片技术简述
- 关于RichTextBox所见即所得(WYSIWYG) 实现探讨,及问题
- 关于删除trace文件的想法
- 纯html页面写的获取系统时间显示
- 【xinfanqie】不为人知的Excel工作表大揭秘
- SQL 内连接,外连接,左连接,右连接, 全连接
- hdu-1823 二维线段树