WebService简介

锦通  金牌会员 | 2024-12-12 12:02:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

Webservice(就是一种远程调用技术,他的作用就是从远程系统中获取业务数据)
  

  • Web Services 是应用步伐组件
  • Web Services 使用开放协议举行通讯
  • Web Services 是独立的(self-contained)并可自我形貌
  • Web Services 可通过使用UDDI来发现
  • Web Services 可被其他应用步伐使用
  webservice 常见名词:
  WSDLWSDL 指网络服务形貌语言(Web Services Description Language)是webservice服务端使用阐明书,阐明服务端接口、方法、参数和返回值,WSDL是随服务发布乐成,自动生成,无需编写SOAPSimple object access protocolSOAP即简朴对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,UDDIUniversal Description, Discovery and IntegrationUDDI 是一种目次服务,企业可以使用它对 Web services 举行注册和搜索。  实验过程:
  

  • Webservice是使用Http发送SOAP协议的数据的一种远程调用技术
  • Webservice要开辟服务端
  • Webservice要开辟客户端
  • Webservice客户端开辟必要阅读服务端的使用阐明书(WSDL)
  

  F:\学习\JAVA_EE\deworkspace\WebServiceClienTest\src>wsimport -s . http://gateway.woxp.cn:6630/gb2312/ws_api/WebSMS.asmx?WSDL
  1.1 Webservice的优缺点
  优点
  -发送方式采用http的post发送,http的默认端口是80,防火墙默认不拦截80,所以跨防火墙
-采用XML格式封装数据,XML是跨平台的,所以webservice也可以跨平台。
-Webservice支持面向对象
  缺点
  采用XML格式封装数据,所以在传输过程中,要传输额外的标签,随着SOAP协议的不断美满,标签越来越大,导致webservice性能下降
  1Webservice应用场景
  1.1 软件集成和复用
  实用场景
  l 发布一个服务(对内/对外),不考虑客户端类型,假如不考虑性能,建议使用webservice
  l 服务端已经确定使用webservice,客户端不能选择,必须使用webservice
  1.1 不实用场景
  l 假如考虑性能时不建议使用webservice
  l 同构步伐下不建议使用webservice,比如java 用RMI,不必要翻译成XML的数据
  WSDL
  1.1 定义
  WSDL及web服务形貌语言,他是webservice服务端使用阐明书,阐明服务端接口、方法、参数和返回值,WSDL是随服务发布乐成,自动生成,无需编写
  1.2 文档布局
  

  

  •          服务视图,webservice的服务结点,它包罗了服务端点
  •          为每个服务端点定义消息格式和协议细节
  •          服务端点,形貌 web service可被实验的操作方法,以及相关的消息,通过binding指向portType
  •          定义一个操作(方法)的数据参数(可有多个参数)
  •          定义 web service 使用的全部数据类型
  1.3 阅读方式:从下往上
  

  2 SOAP
  2.1 定义
  :l SOAP即简朴对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。
  SOAP=http+xml
  

  2.2 协议格式
  

  • 必需有 Envelope 元素,此元素将整个 XML 文档标识为一条 SOAP 消息
  • 可选的 Header 元素,包罗头部信息
  • 必需有Body 元素,包罗所有的调用和响应信息
  • 可选的 Fault 元素,提供有关在处置惩罚此消息所发生错误的信息
  2.3 TCP/IP Monitor
  2.3.1 代理原理
  

  2.3.2 配置
  

  

  2.3.3 测试
  在浏览器中输入代理服务地址,能正常访问,代表代理服务器设置乐成
  

  2.4 SOAP1.1
  请求
  1. POST /weather HTTP/1.1
  2. Accept: text/xml, multipart/related
  3. Content-Type: text/xml; charset=utf-8
  4. SOAPAction: "http://ws.jaxws.ws.hanyuanhun.cn/WeatherInterfaceImpl/queryWeatherRequest"
  5. User-Agent: JAX-WS RI 2.2.4-b01
  6. Host: 127.0.0.1:54321
  7. Connection: keep-alive
  8. Content-Length: 214
  9.  
  10. <?xml version="1.0" ?>
  11. <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  12. <S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.hanyuanhun.cn/"><arg0>北京</arg0></ns2:queryWeather>
  13. </S:Body>
  14. </S:Envelope>
复制代码
响应
  1. HTTP/1.1 200 OK
  2. Transfer-encoding: chunked
  3. Content-type: text/xml; charset=utf-8
  4. Date: Thu, 26 Nov 2015 03:14:29 GMT
  5.  
  6. <?xml version="1.0" ?>
  7. <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  8. <S:Body>
  9. <ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.hanyuanhun.cn/"><return>晴</return></ns2:queryWeatherResponse>
  10. </S:Body>
  11. </S:Envelope>
复制代码
2.5 SOAP1.2
  l 如何发布SOAP1.2服务端
  l Jaxws不支持SOAP1.2服务端发布,直接发布会报如下异常
  

  l 假如想发布SOAP1.2服务端,必要在服务端引入第三方JAR(jaxws-ri-2.2.8)
  l 在实现类上加入如下注解
  @BindingType(SOAPBinding.SOAP12HTTP_BINDING)
  请求:
  1. POST /weather HTTP/1.1
  2. Accept: application/soap+xml, multipart/related
  3. Content-Type: application/soap+xml; charset=utf-8;
  4. action="http://ws.jaxws.ws.hanyuanhun.cn/WeatherInterfaceImpl/queryWeatherRequest"
  5. User-Agent: JAX-WS RI 2.2.4-b01
  6. Host: 127.0.0.1:54321
  7. Connection: keep-alive
  8. Content-Length: 212
  9.  
  10. <?xml version="1.0" ?>
  11. <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
  12. <S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.hanyuanhun.cn/"><arg0>北京</arg0></ns2:queryWeather>
  13. </S:Body>
  14. </S:Envelope>
复制代码
响应
  1. HTTP/1.1 200 OK
  2. Transfer-encoding: chunked
  3. Content-type: application/soap+xml; charset=utf-8
  4. Date: Thu, 26 Nov 2015 03:25:24 GMT
  5.  
  6. <?xml version='1.0' encoding='UTF-8'?>
  7. <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
  8. <S:Body>
  9. <ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.hanyuanhun.cn/"><return>晴</return></ns2:queryWeatherResponse>
  10. </S:Body>
  11. </S:Envelope>
复制代码
2.6 SOAP1.1和SOAP1.2区别
  雷同点:
  

  • 请求发送方式雷同:都是使用POST
  • 协议内容雷同:都有Envelope和Body标签
  • 不同点:
  • 数据格式不同:content-type不同
  • SOAP1.1:text/xml;charset=utf-8
  • SOAP1.2:application/soap+xml;charset=utf-8
  定名空间不同:
  

  • SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/
  • SOAP1.2:http://www.w3.org/2003/05/soap-envelope
  3 UDDI
  UDDI 是一种目次服务,企业可以使用它对 Web services 举行注册和搜索。UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用形貌、发现与集成服务”。
  UDDI 并不像 WSDL 和 SOAP 一样深入民气,因为很多时候,使用者知道 Web 服务的位置(通常位于公司的企业内部网中)。
  回顾

  l 什么是webservice
  l 什么是远程调用:系统和系统之间的调用,从远程系统当中获取业务数据。
  l Webservice是web服务:他是用http传输SOAP协议数据的一种远程调用技术
  l Webservice入门步伐
  l 服务端
  n 第一步:创建SEI接口
  n 第二步:创建SEI实现类,要在类上加入@WebService
  n 第三步:发布服务,Endpoint的publish方法,2两个参数:1.服务地址;2.实现类实例
  n 第四步:测试服务是否发布乐成,通过阅读使用阐明书,确定服务接口、方法、参数、返回值存在,阐明服务发布乐成。
  u WSDL地址:服务地址+”?wsdl”
  u WSDL阅读方式,从下往上,servvice->binding->portType->其中有接口、方法、参数和返回值
  l 客户端
  n 第一步:使用wsimport生成客户端代码
  n 第二步:根据使用阐明书,使用客户端调用服务端
  u 创建服务视图,视图是从service的name属性获取
  u 获取服务实现类,从portType的name属性获取
  u 调用查询方法,从portType下的operation标签的name属性获取
  l 优缺点:
  n 发送方式采用http的post,http默认端口是80,所以跨越防火墙
  n 数据封装使用XML格式,XML是跨平台,所以webservice可以跨平台
  n Webservice支持面向对象开辟
  l Webservice应用场景
  l 软件集成和复用
  l 实用场景:
  n 发布服务(对内/对外),不考虑性能,不考虑客户端类型,建议使用webservice
  n 服务端已确定使用webservice,客户端只能使用webservice
  l 不实用场景:
  n 考虑性能时,不建议使用webservice
  n 同构步伐下,不建议使用webservice,比如客户端服务端都是java开辟,建议Java RMI
  l WSDL
  l 定义:WSDL即Web服务形貌语言,他是webservice服务端的使用阐明书,他阐明服务端接口、方法、参数和返回值,他是随服务发布乐成,自动生成,无需编写
  l 文档布局:
  n Service
  n Binding
  n portType
  n message
  n types
  l 阅读方式:从下往上
  l SOAP
  l 定义:SOAP即简朴对象访问协议,他是使用http发送的XML格式的数据,跨平台、跨防火墙,他不是webservice的专有协议
  l SOAP=http+xml
  l 协议的格式:
  n 必须有:envelope和body
  n 非必有:header和fault
  l SOAP1.1和1.2区别:
  n 雷同点:
  u 都使用http的POST发送请求
  u 协议的格式都雷同:都有envelope标签和body标签
  n 不同点:
  u Content-type:
  SOAP1.1:text/xml;charset=utf-8;SOAP1.2:application/soap+xml;charset=utf-8
  l 定名空间不同:
  l UDDI:就是一个目次服务,提供搜索和注册功能,因为不常用,所以了解下就可以了。
  5 Webservice的四种客户端调用方式
  公网服务地址:
  http://www.webxml.com.cn/zh_cn/index.aspx
  5.1 第一种生成客户端调用方式
  5.1.1 Wsimport下令先容
  l Wsimport就是jdk提供的的一个工具,他作用就是根据WSDL地址生成客户端代码
  l Wsimport位置JAVA_HOME/bin
  l Wsimport常用的参数:
  l -s,生成java文件的
  l -d,生成class文件的,默认的参数
  l -p,指定包名的,假如不加该参数,默认包名就是wsdl文档中的定名空间的倒序
  l Wsimport仅支持SOAP1.1客户端的生成
  5.1.2 调用公网手机号归属地查询服务
  l 第一步:wsimport生成客户端代码
  wsimport -p cn.hanyuanhun.mobile -s . http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
  l 第二步:阅读使用阐明书,使用生成客户端代码调用服务端
  1. package cn.hanyuanhun.mobile.client;
  2.  
  3. import cn.hanyuanhun.mobile.MobileCodeWS;
  4. import cn.hanyuanhun.mobile.MobileCodeWSSoap;
  5.  
  6. /**
  7.  *
  8.  * <p>Title: MobileClient.java</p>
  9.  * <p>Description:公网手机号查询客户端</p>
  10.  * <p>Company:</p>
  11.  * @author 
  12.  * @date 2015年11月26日下午3:16:05
  13.  * @version 1.0
  14.  */
  15. publicclass MobileClient {
  16.  
  17.    publicstaticvoid main(String[] args) {
  18.       //创建服务视图
  19.       MobileCodeWS mobileCodeWS = new MobileCodeWS();
  20.       //获取服务实现类
  21.       MobileCodeWSSoap mobileCodeWSSoap = mobileCodeWS.getPort(MobileCodeWSSoap.class);
  22.       //调用查询方法
  23.       String reuslt = mobileCodeWSSoap.getMobileCodeInfo("13888888", null);
  24.       System.out.println(reuslt);
  25.    }
  26. }
复制代码
5.1.3 公网天气服务端查询
  1. package cn.hanyuanhun.mobile.client;
  2.  
  3. import java.util.List;
  4.  
  5. import cn.hanyuanhun.weather.ArrayOfString;
  6. import cn.hanyuanhun.weather.WeatherWS;
  7. import cn.hanyuanhun.weather.WeatherWSSoap;
  8.  
  9. /**
  10.  *
  11.  * <p>Title: WeatherClient.java</p>
  12.  * <p>Description:公网天气查询客户端</p>
  13.  * <p>Company: </p>
  14.  * @author  
  15.  * @date    2015年11月26日下午3:24:12
  16.  * @version 1.0
  17.  */
  18. publicclass WeatherClient {
  19.  
  20.    publicstaticvoid main(String[] args) {
  21.       WeatherWS weatherWS = new WeatherWS();
  22.       WeatherWSSoap weatherWSSoap = weatherWS.getPort(WeatherWSSoap.class);
  23.       ArrayOfString  arrayOfString = weatherWSSoap.getWeather("成都", "");
  24.       List<String> list = arrayOfString.getString();
  25.      
  26.       for(String str : list){
  27.          System.out.println(str);
  28.       }
  29.    }
  30. }
复制代码
5.1.4 特点
  该种方式使用简朴,但一些关键的元素在代码生成时写死到生成代码中,不方便维护,所以仅用于测试。
  6 第二种:service编程调用方式
  1. package cn.hanyuanhun.mobile.client;
  2.  
  3. import java.io.IOException;
  4. importjava.net.MalformedURLException;
  5. import java.net.URL;
  6. import javax.xml.namespace.QName;
  7. import javax.xml.ws.Service;
  8. import cn.hanyuanhun.mobile.MobileCodeWSSoap;
  9. /**
  10.  *
  11.  * <p>Title: ServiceClient.java</p>
  12.  * <p>Description:Service编程实现服务端调用</p>
  13.  * <p>Company: </p>
  14.  * @author 
  15.  * @date    2015年11月26日下午3:43:55
  16.  * @version 1.0
  17.  */
  18. publicclass ServiceClient {
  19.  
  20.    publicstaticvoid main(String[] args) throws IOException {
  21.       //创建WSDL的URL,注意不是服务地址
  22.       URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
  23.      
  24.       //创建服务名称
  25.       //1.namespaceURI - 命名空间地址
  26.       //2.localPart - 服务视图名
  27.       QName qname = new QName("http://WebXml.com.cn/", "MobileCodeWS");
  28.      
  29.       //创建服务视图
  30.       //参数解释:
  31.       //1.wsdlDocumentLocation - wsdl地址
  32.       //2.serviceName - 服务名称
  33.       Service service = Service.create(url, qname);
  34.       //获取服务实现类
  35.       MobileCodeWSSoap mobileCodeWSSoap = service.getPort(MobileCodeWSSoap.class);
  36.       //调用查询方法
  37.       String result = mobileCodeWSSoap.getMobileCodeInfo("1866666666", "");
  38.       System.out.println(result);
  39.    }
  40. }
复制代码
6.1 特点
  该种方式可以自定义关键元素,方便以后维护,是一种标准的开辟方式
  7 第三种:HttpURLConnection调用方式
  开辟步骤:
  第一步:创建服务地址
  第二步:打开一个通向服务地址的毗连
  第三步:设置参数
  设置POST,POST必须大写,假如不大写,报如下异常
  

  假如不设置输入输出,会报如下异常
  

  第四步:组织SOAP数据,发送请求
  第五步:吸收服务端响应,打印
  1. package cn.hanyuanhun.mobile.client;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.net.HttpURLConnection;
  9. importjava.net.MalformedURLException;
  10. import java.net.URL;
  11.  
  12. /**
  13.  *
  14.  * <p>Title: HttpClient.java</p>
  15.  * <p>Description:HttpURLConnection调用方式</p>
  16.  * <p>Company: </p>
  17.  * @author 
  18.  * @date    2015年11月26日下午3:58:57
  19.  * @version 1.0
  20.  */
  21. publicclass HttpClient {
  22.  
  23.    publicstaticvoid main(String[] args) throws IOException {
  24.       //第一步:创建服务地址,不是WSDL地址
  25.       URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
  26.       //第二步:打开一个通向服务地址的连接
  27.       HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  28.       //第三步:设置参数
  29.       //3.1发送方式设置:POST必须大写
  30.       connection.setRequestMethod("POST");
  31.       //3.2设置数据格式:content-type
  32.       connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
  33.       //3.3设置输入输出,因为默认新创建的connection没有读写权限,
  34.       connection.setDoInput(true);
  35.       connection.setDoOutput(true);
  36.  
  37.       //第四步:组织SOAP数据,发送请求
  38.       String soapXML = getXML("15226466316");
  39.       OutputStream os = connection.getOutputStream();
  40.       os.write(soapXML.getBytes());
  41.       //第五步:接收服务端响应,打印
  42.       intresponseCode = connection.getResponseCode();
  43.       if(200 == responseCode){//表示服务端响应成功
  44.          InputStream is = connection.getInputStream();
  45.          InputStreamReader isr = new InputStreamReader(is);
  46.          BufferedReader br = new BufferedReader(isr);
  47.         
  48.          StringBuilder sb = new StringBuilder();
  49.          String temp = null;
  50.          while(null != (temp = br.readLine())){
  51.             sb.append(temp);
  52.          }
  53.          System.out.println(sb.toString());
  54.         
  55.          is.close();
  56.          isr.close();
  57.          br.close();
  58.       }
  59.  
  60.       os.close();
  61.    }
  62.   
  63.    /**
  64.     * <?xml version="1.0" encoding="utf-8"?>
  65. <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/">
  66.   <soap:Body>
  67.     <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
  68.       <mobileCode>string</mobileCode>
  69.       <userID>string</userID>
  70.     </getMobileCodeInfo>
  71.   </soap:Body>
  72. </soap:Envelope>
  73.     * @param phoneNum
  74.     * @return
  75.     */
  76.    publicstatic String getXML(String phoneNum){
  77.       String soapXML = "<?xml version="1.0" encoding="utf-8"?>"
  78.       +"<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/">"
  79.          +"<soap:Body>"
  80.           +"<getMobileCodeInfo xmlns="http://WebXml.com.cn/">"
  81.              +"<mobileCode>"+phoneNum+"</mobileCode>"
  82.             +"<userID></userID>"
  83.           +"</getMobileCodeInfo>"
  84.         +"</soap:Body>"
  85.       +"</soap:Envelope>";
  86.       returnsoapXML;
  87.    }
  88. }
复制代码
8 Ajax调用方式
  1. <!doctype html>
  2. <html lang="en">
  3.  <head>
  4.   <meta charset="UTF-8">
  5.   <title>Document</title>
  6.   <script type="text/javascript">
  7.          function queryMobile(){
  8.                    //创建XMLHttpRequest对象
  9.                    var xhr = new XMLHttpRequest();
  10.                    //打开连接
  11.                   xhr.open("post","http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx",true);
  12.                    //设置数据类型
  13.                    xhr.setRequestHeader("content-type","text/xml;charset=utf-8");
  14.                    //设置回调函数
  15.                    xhr.onreadystatechange=function(){
  16.                             //判断是否发送成功和判断服务端是否响应成功
  17.                             if(4 == xhr.readyState && 200 == xhr.status){
  18.                                      alert(xhr.responseText);
  19.                             }
  20.                    }
  21.                    //组织SOAP协议数据
  22.                    var soapXML = "<?xml version="1.0" encoding="utf-8"?>"
  23.                    +"<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/">"
  24.                             +"<soap:Body>"
  25.                        +"<getMobileCodeInfo xmlns="http://WebXml.com.cn/">"
  26.                                 +"<mobileCode>"+document.getElementById("phoneNum").value+"</mobileCode>"
  27.                          +"<userID></userID>"
  28.                        +"</getMobileCodeInfo>"
  29.                      +"</soap:Body>"
  30.                    +"</soap:Envelope>";
  31.                    alert(soapXML);
  32.                    //发送数据
  33.                    xhr.send(soapXML);
  34.          }
  35.   </script>
  36.  </head>
  37.  <body>
  38.   手机号查询:<input type="text" id="phoneNum"/> <input type="button" value="查询" onclick="javascript:queryMobile();"/>
  39.  </body>
  40. </html>
复制代码
9 深入开辟:用注解修改WSDL内容
  WebService的注解都位于javax.jws包下:
  @WebService-定义服务,在public class上边
  targetNamespace:指定定名空间
  name:portType的名称
  portName:port的名称
  serviceName:服务名称
  endpointInterface:SEI接口地址,假如一个服务类实现了多个接口,只必要发布一个接口的方法,可通过此注解指定要发布服务的接口。
  @WebMethod-定义方法,在公开方法上边
  1. operationName:方法名
  2.    exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false
复制代码
@WebResult-定义返回值,在方法返回值前边
  1. name:返回结果值的名称
复制代码
@WebParam-定义参数,在方法参数前边
  1. name:指定参数的名称
复制代码
作用:
  通过注解,可以更加形像的形貌Web服务。对自动生成的wsdl文档举行修改,为使用者提供一个更加清楚的wsdl文档。
  当修改了WebService注解之后,会影响客户端生成的代码。调用的方法名和参数名也发生了变革
     原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表