西安市网站,建设文化网站好处,公司做网站设计的,找设计师的网站WebService
WebService简介
Web Service技术#xff0c; 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件#xff0c; 就可相互交换数据或集成。依据Web Service规范实施的应用之间#xff0c; 无论它们所使用的语言、 平台或内部协议是什么 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件 就可相互交换数据或集成。依据Web Service规范实施的应用之间 无论它们所使用的语言、 平台或内部协议是什么 都可以相互交换数据。
简单的说WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台就是说服务端程序采用java编写客户端程序则可以采用其他编程语言编写反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用就是一台计算机的应用可以调用其他计算机上的应用。例如支付宝支付宝并没有银行卡等数据它只是去调用银行提供的接口来获得数据。还有天气预报等也是气象局把自己的系统服务以webservice服务的形式暴露出来让第三方网站和程序可以调用这些服务功能。
WebService原理
XML,SOAP和WSDL就是构成WebService平台的三大技术 。
WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据XML主要的优点在于它是跨平台的。 WebService通过HTTP协议发送请求和接收结果时发送的请求内容和结果内容都采用XML格式封装并增加了一些特定的HTTP消息头以说明HTTP消息的内容格式这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。 WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说WSDL就像是一个说明书用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址1.注册到UDDI服务器以便被人查找2.直接告诉给客户端调用者。
WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据然后由Http协议来传输数据。
JAVA WebService规范
Java 中共有三种WebService 规范分别是JAXMSAAJ、JAX-WSJAX-RPC、JAX-RS。
(1)JAX-WS
JAX-WSJava API For XML-WebService。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPCjava API For XML-Remote Procedure Call目前已经被JAX-WS 规范取代JAX-WS 是JAX-RPC 的演进版本但JAX-WS 并不完全向后兼容JAX-RPC二者最大的区别就是RPC/encoded 样式的WSDLJAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除如果你使用J2EE1.4其API 位于javax.xml.rpc.包。JAX-WSJSR 224规范的API 位于javax.xml.ws.包其中大部分都是注解提供API 操作Web 服务通常在客户端使用的较多由于客户端可以借助SDK 生成因此这个包中的API 我们较少会直接使用。
(2)JAXMSAAJ
JAXMJAVA API For XML Message主要定义了包含了发送和接收消息所需的API相当于Web 服务的服务器端其API 位于javax.messaging.*包它是Java EE 的可选包因此你需要单独下载。
SAAJSOAP With Attachment API For JavaJSR 67是与JAXM 搭配使用的API为构建SOAP 包和解析SOAP 包提供了重要的支持支持附件传输它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范其API 位于javax.xml.soap.*包。
JAXMSAAJ 与JAX-WS 都是基于SOAP 的Web 服务相比之下JAXMSAAJ 暴漏了SOAP更多的底层细节编码比较麻烦而JAX-WS 更加抽象隐藏了更多的细节更加面向对象实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节可以使用JAXMSAAJ。
(3)JAX-RS
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范由于推出的较晚该规范JSR 311目前JAX-RS 的版本为1.0并未随JDK1.6 一起发行。
WebService入门案例
服务端的实现
我们来实现一个天气系统的案例客户端发送城市名称服务器端回应相应的天气。
1. 编写SEI(Service Endpoint Interface)SEI在webservice中称为portType在java中就是普通接口 public interface WeatherInterface {public String queryWeather(String cityName);
}2. 编写SEI实现类此类作为webservice提供服务类 WebService //WebService表示该类是一个服务类需要发布其中的public的方法
public class WeatherInterfaceImpl implements WeatherInterface {Overridepublic String queryWeather(String cityName) {System.out.println(获取城市名cityName);String weather暴雨; return weather;}}
3. 第三步发布服务Endpoint类发布服务publish方法两个参数1.服务地址2.服务实现类 public class WeatherServer {public static void main(String[] args) {Endpoint.publish(http://127.0.0.1:12345/weather, new WeatherInterfaceImpl());}
}4. 测试服务是否发布成功通过阅读wsdl确定客户端调用的接口、方法、参数和返回值存在证明服务发布成功//我们在浏览器输入 http://127.0.0.1:12345/weather?wsdl 来获取wsdl文件进行阅读//wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.//现在我们还不知道怎么去阅读后面我们会详解只要能获取到就能确定WebService服务发布成功 客户端的实现
//客户端调用服务有很多种方法我们先用工具生成客户端代码后面会详解 //wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。1.创建一个客户端空项目cmd命令行进入此项目的src目录使用以下命令生成客户端代码 wsimport -s . http://127.0.0.1:12345/weather?wsdl-s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.最后面的http….是指获取wsdl说明书的地址2.编写客户端
public class WeatherClient {public static void main(String[] args) {//创建服务视图视图是从wsdl文件的service标签的name属性获取WeatherInterfaceImplService weatherInterfaceImplServicenew WeatherInterfaceImplService(); //获取服务实现类实现类从wsdl文件的portType的name属性获取WeatherInterfaceImpl weatherInterfaceImplweatherInterfaceImplService.getPort(WeatherInterfaceImpl.class); //获取查询方法从portType的operation标签获取String weatherweatherInterfaceImpl.queryWeather(北京);System.out.println(weather);}}至此我们的客户端就可以获取远程服务端的数据接下来我们来详解一下各个部分。
WSDL
WSDL(Web Services Description Language), web服务描述语言他是webservice服务端使用说明书说明服务端接口、方法、参数和返回值WSDL是随服务发布成功自动生成无需编写。
文档结构 Service相关端口的集合包括其关联的接口、操作、消息等。
Binding特定端口类型的具体协议和数据格式规范
portType: 服务端点描述 web service可被执行的操作方法以及相关的消息通过binding指向portType
message: 定义一个操作方法的数据参数
types: 定义 web service 使用的全部数据类型
阅读方式
WSDL文档应该从下往上阅读。
1.先看service标签看相应port的binding属性然后通过值查找上面的binding标签。
2.通过binding标签可以获得具体协议等信息然后查看binding的type属性
3.通过binding的type属性查找对应的portType可以获得可操作的方法和参数、返回值等。
4.通过portType下的operation标签的message属性可以向上查找message获取具体的数据参数信息。
SOAP
SOAP即简单对象访问协议他是使用http发送的XML格式的数据它可以跨平台跨防火墙SOAP不是webservice的专有协议。
SOAPhttpxml
SOAP结构
必需的 Envelope 元素可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素包含头部信息
必需的 Body 元素包含所有的调用和响应信息
可选的 Fault 元素提供有关在处理此消息所发生错误的信息我们来看一下我们上面天气程序发送的数据的格式这需要一个工具TCP/IP Monitor Eclipse自带的Debug工具之一用于捕获Http、TCP/IP协议包。原理是一个代理服务客户端先把数据发送到代理服务然后代理服务再把数据发送到服务器这样就能获取请求数据和响应数据。
第一步打开这个工具选择other然后输入TCP/IP Monitor 第二步设置要代理的服务器 第三步详细设置
第一个参数是代理服务器端口我们设置为54321
第二个参数是被代理服务器的地址第三个参数是被代理服务器的端口
第四个参数要选择为TCP/IP第四步检测是否设置成功我们访问代理服务器来获得wsdl文件 第五步设置成功后我们需要改一下客户端要连接的服务器改成代理服务器的端口
将WeatherInterfaceImplService里的所有原来地址的端口改为54321第六步我们启动我们的客户端获取请求数据和响应数据 请求 //先发送get请求去获得wsdl文件然后获得方法、参数等信息
GET /weather?wsdl HTTP/1.1
User-Agent: Java/1.8.0_111
Host: 127.0.0.1:54321
Accept: text/html, image/gif, image/jpeg, *; q.2, */*; q.2
Connection: keep-alive//发送数据
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charsetutf-8
SOAPAction: http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 203?xml version1.0 ?
S:Envelope xmlns:Shttp://schemas.xmlsoap.org/soap/envelope/
S:Body
ns2:queryWeather xmlns:ns2http://ws.cad.com/
arg0北京/arg0
/ns2:queryWeather
/S:Body
/S:Envelope 响应数据 HTTP/1.1 200 OK
Date: Tue, 25 Jul 2017 05:05:58 GMT
Transfer-encoding: chunked
Content-type: text/xml;charsetutf-8//响应wsdl内容来获得方法、参数等信息
899
?xml version1.0 encodingUTF-8?!-- Published by JAX-WS RI (http://jax-ws.java.net). RIs version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --!-- Generated by JAX-WS RI (http://jax-ws.java.net). RIs version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --definitions xmlns:wsuhttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd xmlns:wsphttp://www.w3.org/ns/ws-policy xmlns:wsp1_2http://schemas.xmlsoap.org/ws/2004/09/policy xmlns:wsamhttp://www.w3.org/2007/05/addressing/metadata xmlns:soaphttp://schemas.xmlsoap.org/wsdl/soap/ xmlns:tnshttp://ws.cad.com/ xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlnshttp://schemas.xmlsoap.org/wsdl/ targetNamespacehttp://ws.cad.com/ nameWeatherInterfaceImplService
types
xsd:schema
xsd:import namespacehttp://ws.cad.com/ schemaLocationhttp://127.0.0.1:54321/weather?xsd1/xsd:import
/xsd:schema
/types
message namequeryWeather
part nameparameters elementtns:queryWeather/part
/message
message namequeryWeatherResponse
part nameparameters elementtns:queryWeatherResponse/part
/message
portType nameWeatherInterfaceImpl
operation namequeryWeather
input wsam:Actionhttp://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest messagetns:queryWeather/input
output wsam:Actionhttp://ws.cad.com/WeatherInterfaceImpl/queryWeatherResponse messagetns:queryWeatherResponse/output
/operation
/portType
binding nameWeatherInterfaceImplPortBinding typetns:WeatherInterfaceImpl
soap:binding transporthttp://schemas.xmlsoap.org/soap/http styledocument/soap:binding
operation namequeryWeather
soap:operation soapAction/soap:operation
input
soap:body useliteral/soap:body
/input
output
soap:body useliteral/soap:body
/output
/operation
/binding
service nameWeatherInterfaceImplService
port nameWeatherInterfaceImplPort bindingtns:WeatherInterfaceImplPortBinding
soap:address locationhttp://127.0.0.1:54321/weather/soap:address
/port
/service
/definitions
0//响应数据
HTTP/1.1 200 OK
Date: Tue, 25 Jul 2017 05:05:59 GMT
Transfer-encoding: chunked
Content-type: text/xml; charsetutf-8df
?xml version1.0 ?
S:Envelope xmlns:Shttp://schemas.xmlsoap.org/soap/envelope/
S:Bodyns2:queryWeatherResponse xmlns:ns2http://ws.cad.com/return暴雨/return /ns2:queryWeatherResponse
/S:Body
/S:Envelope
0UDDI
UDDI 是一种目录服务企业可以使用它对 Web services 进行注册和搜索。 如果我们要使用一种服务但是不知道地址wsdl等我们就可以在UDDI中查找。 大部分情况下我们都是知道服务地址的。
Webservice的客户端调用方式
一生成客户端调用方式
wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).
wsimport.exe位于JAVA_HOME\bin目录下
常用参数为:-d目录 - 将生成.class文件。默认参数。-s目录 - 将生成.java文件。-p生成的新包名 -将生成的类放于指定的包下调用公网的手机归属地查询服务
公网服务地址 (里面提供了很多免费调用的服务) http://www.webxml.com.cn/zh_cn/index.aspx
第一步wsimport生成客户端代码 wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl会出现一些警告是因为服务端提供的一些方法是SOAP1.2标准的这个工具没有实现SOAP1.2标准的生成方式。 第二步查看wsdl文件获取我们需要的信息 第三步根据获取到的服务名等信息来创建我们的客户端 public class MobileClient {public static void main(String[] args) {//创建服务视图MobileCodeWS mobileCodeWSnew MobileCodeWS();//获取服务实现类MobileCodeWSSoap mobileCodeWSSoap mobileCodeWS.getPort(MobileCodeWSSoap.class);//调用查询方法String messagemobileCodeWSSoap.getMobileCodeInfo(xxxxxxxx, null);System.out.println(message);}
}第四步获取到信息 还有天气等服务自己可以去实现一下。
该种方式使用简单但一些关键的元素在代码生成时写死在生成代码中不方便维护所以仅用于测试。
二service编程调用方式
public class MobileClient2 {public static void main(String[] args) throws IOException {//创建WSDL文件的URLURL wsdlDocumentLocationnew URL(http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl); //创建服务名称//1.namespaceURI - 命名空间地址//2.localPart - 服务视图名QName serviceNamenew QName(http://WebXml.com.cn/,MobileCodeWS);Service serviceService.create(wsdlDocumentLocation, serviceName);//获取服务实现类MobileCodeWSSoap mobileCodeWSSoap service.getPort(MobileCodeWSSoap.class);//调用方法String messagemobileCodeWSSoap.getMobileCodeInfo(XXXXXXX, null);System.out.println(message);}}
该种方式可以自定义命名空间服务视图名等元素方便以后维护是一种标准的开发方式 。
三HttpURLConnection调用方式
这种方式是由自己编写客户端不再由工具生成比较麻烦。
开发步骤 第一步创建服务地址第二步打开一个通向服务地址的连接第三步设置参数第四步组织SOAP数据发送请求第五步接收服务端响应 public class MobileClient2 {public static void main(String[] args) throws IOException {//第一步创建服务地址不是WSDL地址URL url new URL(http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx);//第二步打开一个通向服务地址的连接HttpURLConnection connection (HttpURLConnection) url.openConnection();//第三步设置参数//3.1发送方式设置POST必须大写connection.setRequestMethod(POST);//3.2设置数据格式content-typeconnection.setRequestProperty(content-type, text/xml;charsetUTF-8);//3.3设置输入输出因为默认新创建的connection没有读写权限connection.setDoInput(true);connection.setDoOutput(true);//第四步组织SOAP数据发送请求String soapXML getXML(XXXXXXX);OutputStream os connection.getOutputStream();os.write(soapXML.getBytes());//第五步接收服务端响应打印int responseCode connection.getResponseCode();if(200 responseCode){//表示服务端响应成功InputStream is connection.getInputStream();//将字节流转换为字符流InputStreamReader isr new InputStreamReader(is,utf-8);//使用缓存区BufferedReader br new BufferedReader(isr);StringBuilder sb new StringBuilder();String temp null;while(null ! (temp br.readLine())){sb.append(temp);}System.out.println(sb.toString());is.close();isr.close();br.close();}os.close();}//组织数据将数据拼接一下public static String getXML(String phoneNum){String soapXML ?xml version\1.0\ encoding\utf-8\?soap:Envelope xmlns:xsi\http://www.w3.org/2001/XMLSchema-instance\ xmlns:xsd\http://www.w3.org/2001/XMLSchema\ xmlns:soap\http://schemas.xmlsoap.org/soap/envelope/\soap:BodygetMobileCodeInfo xmlns\http://WebXml.com.cn/\mobileCodephoneNum/mobileCodeuserID/userID/getMobileCodeInfo/soap:Body/soap:Envelope;return soapXML;}
} 使用注解修改WSDL内容
作用 通过注解可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改为使用者提供一个更加清晰的wsdl文档
WebService的注解都位于javax.jws包下: WebService-定义服务在类上边targetNamespace指定命名空间nameportType的名称portNameport的名称serviceName服务名称endpointInterfaceSEI接口地址如果一个服务类实现了多个接口只需要发布一个接口的方法可通过此注解指定要发布服务的接口。 WebMethod-定义方法在公开方法上边operationName方法名exclude设置为true表示此方法不是webservice方法反之则表示webservice方法默认是false WebResult-定义返回值在方法返回值前边name返回结果值的名称 WebParam-定义参数在方法参数前边name指定参数的名称//以我们前面做的天气案例为例子WebService(targetNamespacehttp://service.cad.com,portNameWeatherSOAPPort,serviceNameWeatherWSS,nameWeatherSOAP
)
public class WeatherInterfaceImpl implements WeatherInterface {WebMethod(operationNamegetWeather,excludefalse)public WebResult(nameresult)String queryWeather(WebParam(namecityName)String cityName) {System.out.println(获取城市名cityName);String weather暴雨; return weather;}}
然后重新发布服务我们再访问wsdl文件就可以看到我们改变的内容