WebService教程详解

来源:互联网 发布:如何解除单位网络权限 编辑:程序博客网 时间:2024/06/06 00:59

WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求,接下来通过本文给大家介绍WebService教程详解,对webservice教程感兴趣的朋友一起学习吧。

Web Services 可以将应用程序转换为网络应用程序。

通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。

Web Services 可以被其他应用程序使用。

通过 Web Services,您的会计部门的 Win 2k 服务器可以与 IT 供应商的 UNIX 服务器相连接。

基本的 Web Services 平台是 XML+HTTP。

Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据。

什么是webService

WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用.

1:从WebService的工作模式上理解的话,它跟普通的Web程序(比如ASP、JSP等)并没有本质的区别,都是基于HTTP传输协议的程序。 

2:WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。

webService的技术支持

Web Service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。目前这些协议有:

XML和XSD

  可扩展的标记语言XML 是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。

  Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB. NET或C# 来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP。

SOAP

  SOAP即简单对象访问协议(Simple Object Access Protocal),它是用于交换XML编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。

  Web Service 希望实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。

WSDL

  Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

UDDI

  UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。 调用RPC与消息传递

  Web Service本身其实是在实现应用程序间的通信。我们现在有两种应用程序通信的方法:RPC远程过程调用 和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。

如何发布一个WebService?

1、用Jdk1.6.0_21以后的版本发布一个WebService服务.并通过地址栏查看它的wsdl文档. 

2、通过wsimport生成客户端代码,调用并查看运行的结果.(学会如何调用是我们的重点).

需要注意的是,jdk1.6._07以后jdk版本发布WebService时必须要完整的对代码进行注解,如果使用的是jdk1.6.0_21以后版本,因为它已经内含了ws2.1所以,可以只对类添加@WebService的注解. 

以下是两段不同的代码:

在jdk1.6.0_13的版本上发布的ws:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
packagecom.itcast;
importjavax.jws.WebMethod;
importjavax.jws.WebService;
importjavax.jws.soap.SOAPBinding;
importjavax.jws.soap.SOAPBinding.Style;
importjavax.xml.ws.Endpoint;
@WebService(targetNamespace="http://loalhost:9999/helloworld")
@SOAPBinding(style=Style.RPC)//只支持RPC的消息风格
publicclass HelloWorld {
//以下通过@WebMethod注解,对外公开方法
@WebMethod
publicString sayHello(){
return"HelloWorld";
}
publicstatic void main(String[] args) {
Endpoint.publish("http://localhost:9999/helloworld",newHelloWorld());
}
}

2:以下是在jdk1.6.0_24上发布的WebService代码: 

?
1
2
3
4
5
6
7
8
9
10
11
12
package com.itcast;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService//注意只有此一个注解,此注解也是必须的,默认的SOAP消息风格为:DOCUMENT
public class HelloWorld {
public String sayHello(){
return"HelloWorld";
}
public static void main(String[] args) {
Endpoint.publish("http://localhost:9999/helloworld",newHelloWorld());
}
}

第一个WebService服务 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.itcast;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
* 第一个WebService服务应用
*/
//通过注解,标明此类发布为一个WebService
@WebService
public class HelloWorld {
public String sayHello(){
return"Hello World";
}
//在main方法中,使用javax.xml.ws.Endpoint端点发布一个应用
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:9999/helloworld",
newHelloWorld());
}
}

代码说明:HelloWorld类的所有非静态公开方法将对外部暴露.

Wsimport工具说明:

 wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要. 

 wsimport.exe位于JAVA_HOME\bin目录下. 

 常用参数为: 

• -d<目录> - 将生成.class文件。默认参数。 

• -s<目录> - 将生成.java文件。 

• -p<生成的新包名> -将生成的类,放于指定的包下。

(wsdlurl) - http://server:port/service?wsdl,必须的参数 

使用: 

1:可以通过java –version检查你当前的版本号.如果版本太低可以安装高版本的jdk. 

或直接将别人已安装好的jdk目录拷贝到你的机器如D:\jdk1.6.0_24目录下. 

因为以前的环境变量已经设置成以前老版本的jdk目录,即JAVA_HOME和PATH两个环境变量. 

可以再重新设置一下环境变量为:JAVA_HOME=D:\jdk1.6.0_24,path=%JAVA_HOME%\bin, 

重新设置了环境变量后,要重新打开一个doc(命令行)窗口.才生效. 

如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24生效: 

set path = D:\jdk1.6.0_24\bin;%PATH%(回车即可) 

再通过java –version查看jdk的版本号是否已经发生变化. 

2:转到一个相对干净的目录下,我在d盘上新建立一个目录名为:ws,并转到此目录下. 

3:开启你的webService. 

4:输入以下命令: 

wsimport –s . http://127.0.0.1:9999/helloworld?wsdl 

参数说明:-s是指编译出源代码文件,后面的.(点)指將代碼放到當前目錄下. 

最后面的http….是指获取wsdl说明书的地址. 

5:此时,将生成.java文件和.class文件.(都包含原始包名).将代码Copy到你的项目中.(只拷贝java文件) 

6:在新的项目中,新一个类,(可位于任意包下),对上面生成的代码进行调用,见下一页ppt. 

7:wsimport其他参数说明,我们经常使用的参数为-d,-s,-p 

-d<目录>将会生成.class文件. 

示例:wsimport –d . http://127.0.0.1:9999/helloworld?wsdl 

-s<目录>将会生成.java文件. 

示例:wsimport –s . http://127.0.0.1:9999/helloworld?wsdl 

-p<包名>将生成的文件(.java或是.class修改成指定的包名) 

示例:wsimport -s . -p com.beijing.itcast http://127.0.0.1:9999/helloworld?wsdl 

对于-p参数,注意包名的修改,它将所生成类,全部置于通过-p指定的包下.(演示) 

需要说明的是,当仅使用-p参数时,它也将同时使用-d即编译成.class文件. –d参数写或不写,它都在那里,不离不弃.

RunMain.java的源代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
packagecom.leaf;
importcom.itcast.HelloWorld;
importcom.itcast.HelloWorldService;
/**
* 通过调用生成的类,来调用远程代码
*/
publicclass RunMain {
publicstatic void main(String[] args) {
//从HelloWorldSerice的getHelloWorldPort方法中返回调用接口
HelloWorld helloWorld =
newHelloWorldService().getHelloWorldPort();
String str = helloWorld.sayHello(); //执行调用
System.err.println(str);//返回HelloWorld字符串
}
}

WebService与普通Web程序的区别

1、 WebService只采用HTTP POST方式传输数据,不使用GET方式;

1) Tttp post的contentType为

(1)application/x-www-form-urlencoded

2) WebService的contentType为

(2) Text/xml soap1.1 
(3) application/soap+xml –soap1.2

2、WebService从数据传输格式上作了限定。

WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。 

WebService和web服务器的区别:

我们可以把WebService看作是Web服务器上应用;反过来说,Web服务器是WebService运行时所必需的容器。这就是它们的区别和联系。 

WebService的特点:

1、 WebService通过HTTP POST方式接受客户的请求 

2、 WebService与客户端之间一般使用SOAP协议传输XML数据. 

3、它本身就是为了跨平台或跨语言而设计的。

使用工具的原因:

1、 使用工具可以更好的了解WebService请求的过程 

2、 使用工具WsExplore可以获取SOAP数据发送和接收的格式 

3、 使用工具Tcp/Ip Monitor可以监控拦截器请求头和响应头的具体数据

什么是SOAP?

SOAP是一种基于XML编码规范的文本协议,简单的说SOAP就是在HTTP的基础上传输XML数据,以实现远程调用【无论你的服务端是什么语言书写的,只要接收SOAP协议的XML数据,并返回SOAP协议的XML数据,就可以被任何语言调用】 

使用WsExplorer实例:验证qq是否在线 

采用qqOnlineWebServiceSoap中的qqCheckOnLine验证时,返回的是 

qqCheckOnlineResponse 
qqCheckOnlineResult (string): N 

点击source可以看到详细信息,信息如下: 

1:这是发出的消息格式: 

复制代码 代码如下:

http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://WebXml.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 


870931520 

2:以下是接收到的XML格式 

复制代码 代码如下:

http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

- http://WebXml.com.cn/"> 


采用qqOnlineWebServiceHttpGet或qqOnlineWebServiceHttpPost中的qqCheckOnline验证时,返回的都是 

Nhttp://WebXml.com.cn/">N> 

使用Tcp/Ip Monitor 

TCP/IP Monitor不仅可以看到SOAP数据,还可以获取HTTP请求和接收的头信息。 

1、位置:此工具位于:window>show view>other>MyEclipse Common(常用工具)>TCP/IP Monitor 

2、此工具,相当于一个代理商,启动后它将监听本地的某个端口,然后再将请求转发给指定的目标IP和端口。 
获取到数据后,再将数据原封不动的返回给客户。在客户看来,永远首先访问的都应该是这个代理,否则我们将看不到数据传输的过程。 

3、 配置选项:

在打开的TCP/IP Monitor界面上:view Menu(右上方向下的小箭头)>Properties>Add(右侧添加) 

设置成以下属性:

第一步:

1)local monitoring port(监听本地的端口号):9876,随意设置一个4位的端口号,一会将通过http://127.0.0.1:9876的形式访问 

2)host name(要监听的服务器,如www.jb51.net):127.0.0.1 –因为本机发布了一个WebService所以监听本机IP.也可以是任意的主机。 

3)Port(要监听的目标服务器的端口):6666 - 因为我们发布的WebService为http://127.0.0.1:6666/helloworld所以,6666是需要监听的端口号。 

4)Type(监听的类型): 
-- TCP/IP : 将使用原始地址继续访问下一个请求,如用户输入:http://127.0.0.1:9876/helloworld?wsdl此时将返回wsdl服务访问地址同前。 

-- HTTP :将使用目标地址继续访问下一个请求。如用户输入: http://127.0.0.1:9876/helloworld?wsdl在请求方法时将使用http://127.0.0.1:6666/helloworld来访问sayHi方法。此种方式将不再会被代理。因为已经不是正在监听的端口号了。 

在监听类型处,我选择了TCP/IP,然后通过在地址栏输入:http://127.0.0.1:9876/helloworld?wsdl,在返回的wsdl文件中查看:处地址的变化情况。 

time out:设置访问不成功的连接时间,保持为0,即不设置。 

在设置好后,点OK按扭,然后再点右方的Start按扭,监听便已经启动。 

第二步:

在MyEclipse的WebService上配置WSDL URL为:http://127.0.0.1:9876/helloworld?wsdl,注意使用的是MyEclipse TCP/IP Monitor的端口。而不是直接去访问我们发布的http://127.0.0.1:6666/helloworld?wsdl 

如何修改wsdl文件的内容? 

使用WebService的注解。 

1、 @WebService-定义服务 

2、 @WebMethod-定义方法 

3、 @WebResult-定义返回值 

4、@WebParam-定义参数 

注意:对于注解,不同的版本支持程度不相同:

1、1.5不支持. 

2、1.6.0_20前版本必须使用完整注解. 

3、1.6.0_21以后可以只使用@WebService对类进行注解. 

注释的作用:

通过WebService的注解,可以更加形像的描述Web服务。从而生成WSDL文档。 

当修改了WebService注解之后,同时会影响客户端生成的代码。 

调用的方法名和参数名也发生了变化。 

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@WebService(name="myName",//对应portType name="myName"
portName="myPort",//对应服务中的port name="myPort"
serviceName="myService",//对应service name="myService"
targetNamespace="http://leaf.com/mynamespace")//可以随意书写类似于java中的package
publicclass HelloWorld{
privatestatic SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@WebMethod(action="myAction",//定义一个soapAction="myAction"用于找到这个方法以执行
operationName="myOperationName")//定义可以调用的方法,会生成相应类的具体方法,operation name=".."
public@WebResult(name="mySayHelloResult")String//定义返回值的名称
sayHello(){
return"HelloWorld";
}
@WebMethod(action="mySayHiAction",operationName="mySayHiOperationName")
public@WebResult(name="mySayHiResult")String sayHi(@WebParam(name="myParaName",
//将参数放到头信息中,用于保护参数,默认在body中
header=true,
mode=Mode.IN)
String name){
String str = "你好:"+name+",当前时间是:"+sdf.format(newDate());
returnstr;
}
publicstatic void main(String[] args) {
Endpoint.publish("http://127.0.0.1:6666/helloworld",newHelloWorld());
}
}

3:将上面的程序对外发布以后,我们通过MyEclipse的WebService Explorer来访问

你会发现和以前不一样的提示信息,但其实,仍然还是调用的那同一个方法。

4:再次使用wsimport –s . http://127.0.0.1:6666/helloworld?wsdl生成java代码然后调用 
以下是调用代码(可以用面目全非来形容,但完成的还是同样的工作。)

?
1
2
3
4
5
6
7
8
9
10
packagecom.leaf.mynamespace;
publicclass Main {
publicstatic void main(String[] args) {
//通过分析wsdl可知从myService中调用getMyPort返回myName
MyName myName = newMyService().getMyPort();
//通过myName的mySayHiOperationName来调用sayHi方法
String str = myName.mySayHiOperationName("王健");
System.err.println(str);
}
}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 换单位后医保卡怎么办 单位没交失业金怎么办 沈阳医保卡密码忘了怎么办 西安网约车资格证怎么办 红跑车卡丢了怎么办 苏州住房公积金密码忘了怎么办 公积金查询密码忘记了怎么办 公积金账户密码忘记了怎么办 公积金网上查询密码忘记了怎么办 苏州改公积金密码忘了怎么办 与单位解除劳动合同公积金怎么办 在泰国钱包丢了怎么办 中山车牌网上选号后怎么办 买楼房70年以后怎么办 暂住证过期2个月怎么办 换领驾驶证超期了怎么办 车牌租出去要不回来怎么办 汽车放久了没电怎么办 上海网约车资格证怎么办 手机掉在滴滴上怎么办 在滴滴上丢手机怎么办 把东西落在出租车上怎么办 租好房子后悔了怎么办 转租房东不退押金怎么办 亲戚借户口本办公租房怎么办 7.1深圳禁行货车怎么办 怎么办无锡市的货车临时通行证 武汉医保卡密码忘了怎么办 打出租车被黑了怎么办 行李掉在出租车上怎么办 家庭农场买农机怎么办补贴 在异地买的保险怎么办 理发店被投诉工商局找我怎么办? 临安市民卡丢了怎么办 合肥分期付款买手机被骗怎么办 公司注销后还遇到投诉怎么办 超市购物结账时少收钱怎么办 卖给顾客东西时会有斜念怎么办 实体店家纺想换货怎么办 劳动仲裁裁决部分不服怎么办 劳动仲裁公司拒不履行怎么办?