了解一下WebService
它们公司服务器的数据库中都保存了天气预报数据吗?
如果没有, 那数据都存在哪了呢?
这些网站是如何得到这些数据的呢?
看我的这个标题,那肯定就是用了webservice啦,网上有免费的天气webservice接口,下面我也会带大家去进行调用。不用web项目什么,一个普通的项目就可以调用。
WebService简介
Webservice也叫XML Web Service,Web服务。可使用开放的xml标准来描述、发布、发现、协调和配置这些应用程序。用于开发分布式的互操作的应用程序。
重点重点!!!是一种跨编程语言、跨操作系统、跨网络的远程服务器调用技术。
学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.。
webservice可以实现跨平台远程调用,从而实现异构程序之间的通信,特定需求下可以实现远程数据共享、软件重用、分布式程序集成。
webservice 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
它采用标准SOAP协议(Simple Object Access Protocol),协议传输webservice数据,是w3c标准。
xml和XSD(XML Schema Datatypes)是webservice的基础,是w3c标准,采用wsdl作为描述语言即webservice使用说明书。
总结:
1、采用xml支持跨平台远程调用。
2、基于http的soap协议,可跨越防火墙。
3、支持面向对象开发。
4、有利于软件和数据重用,实现松耦合。
WebService几个重要的术语
1. WSDL:web service definition language
直译 : WebService定义语言
- 对应一种类型的文件.wsdl (告诉客户端如何调用接口)
- 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
- 一个web service对应一个唯一的wsdl文档
2. SOAP:simple object access protocal
直译: 简单对象访问协议
是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
- soap消息:请求消息和响应消息
- http+xml片断
SOAP协议 = HTTP协议 + XML数据格式
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
UDDI:UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。—简单点说,就是一套规则,方便使用;
web Service原理
Webservice是使用Http发送SOAP协议的数据的一种远程调用技术
Webservice要开发服务端
Webservice要开发客户端
Webservice客户端开发需要阅读服务端的使用说明书(WSDL)
写一个自己的WebService
服务端
随便创建一个项目写一个类
package com;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class MyFirstWebService {
/**
* 定义webservice服务中的方法
*/
public String testWebService(String context){
System.out.println("我收到了信息"+context);
return "服务器:我转发信息给你";
}
public static void main(String[] args) {
//定义自己的webService服务器发布地址
String address="http://localhost:9090/MyFirstWebService";
//通过该方法进行发布
Endpoint.publish(address,new MyFirstWebService());
//打印一句话,表示一下服务器进行了开启
System.out.println("my webservice starting");
}
}
运行main函数,你的WebService已经发布了
查看http://localhost:9090/MyFirstWebService?wsdl
如下图所示就说明你已经成功了
客户端
新建另外一个普通project!!!
点击idea下面的“Terminal"进入你想要生成代码的目路下,我这里进入了src
然后输入命令:wsimport -s . http://localhost:9090/MyFirstWebService?wsdl
下面显示生成代码,等待一会再看我们的目录结构
代码已经导入,接下来两种调用方式
- 普通测试方法
package test;
import com.MyFirstWebService;
import com.MyFirstWebServiceService;
public class MyTestWebService {
public static void main(String[] args) {
//获取webservice服务器对象(这里的类名,其实是从wsdl文件中的servicename标签进行获取的)
MyFirstWebServiceService myFirstWebService=new MyFirstWebServiceService();
//获取我们自定义的webservice对象
MyFirstWebService myFirstWebServicePort=myFirstWebService.getMyFirstWebServicePort();
//调用service服务器中的方法
String receivedInfo=myFirstWebServicePort.testWebService("你好,webservice服务器");
//打印从服务器的方法中获取的返回值,测试表示收到了服务器返回的内容
System.out.println("服务器返回的内容是:"+receivedInfo);
}
}
执行代码,我们看到客户端工程下面打印
上面的乱码我们把jdk1.8改成JBK就可以解决了
服务端控制台:
- QName测试方法,更推荐使用
package test;
import com.MyFirstWebService;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;
public class MyTestQNameWebServivee {
public static void main(String[] args) throws MalformedURLException {
//创建一个连接(地址对相应的就是webservice服务器中的地址)
URL wsdlDocumentLocation=new URL("http://localhost:9090/MyFirstWebService?wsdl");
//这个参数,主要是根据我们设定的webService的接口来进行的
QName serviceName=new QName("http://com/","MyFirstWebServiceService");
Service ws=Service.create(wsdlDocumentLocation,serviceName);
//获取到调用对象的内容
MyFirstWebService port=ws.getPort(MyFirstWebService.class);
//方法的调用
String result=port.testWebService("my name is scw");
System.out.println(result);
}
}
客户端控制台:
服务端控制台:
调用天气webservice
新建一个工程,点击Terminal ,并且进入你要下载的目录
输入命令:wsimport -s . http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
出现了报错情况:
Exception in thread "main" com.sun.tools.internal.ws.wscompile.AbortException
at com.sun.tools.internal.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:129)
at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2283)
at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:183)
at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:126)
at com.sun.tools.internal.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:429)
at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.java:190)
at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.java:168)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:159)
at com.sun.tools.internal.ws.WsImport.main(WsImport.java:42)
我的解决方法:
- 我们进入网站:www.webxml.com.cn/zh_cn/weather_icon.aspx
- 右键这个下载,我放在了D盘
- 用记事本打开下载的文件
- 修改
修改下载的xml文件,将所有的<s:element ref=“s:schema” /> <s:any />改成 <s:any minOccurs=“2” maxOccurs=“2”/>,一共有两处需要修改,建议查找<s:element ref=“s:schema” />,修改时把<s:any />也要删掉。
- 打开Terminal 执行命令:wsimport -keep E:\WeatherWS.asmx.xml,看到一下就成功了
测试
package com;
import cn.com.webxml.ArrayOfString;
import cn.com.webxml.WeatherWebService;
import cn.com.webxml.WeatherWebServiceSoap;
import java.util.List;
public class Test {
public static void main(String[] args) {
String theCity="北京";
WeatherWebService weatherWebService=new WeatherWebService();
WeatherWebServiceSoap weatherWebServiceSoap=weatherWebService.getWeatherWebServiceSoap();
ArrayOfString weather=weatherWebServiceSoap.getWeatherbyCityName(theCity);
List<String> strings=weather.getString();
for (String str:strings
) {
System.out.println(str);
System.out.println("===========");
}
}
}
控制台打印出:
直辖市
===========
北京
===========
54511
===========
54511.jpg
===========
2020/6/9 14:58:40
===========
22℃/30℃
===========
6月9日 小雨转雷阵雨
===========
北风3-4级转东南风小于3级
===========
7.gif
===========
4.gif
===========
今日天气实况:气温:27℃;风向/风力:东风 2级;湿度:52%;紫外线强度:最弱。空气质量:良。
===========
紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。
健臻·血糖指数:易波动,气温多变,血糖易波动,请注意监测。
穿衣指数:热,适合穿T恤、短薄外套等夏季服装。
洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。
空气污染指数:良,气象条件有利于空气污染物扩散。
webservice,restfull,dubbo的区别
首先需要了解:REST是一种架构风格,其核心是面向资源;而webService底层SOAP协议,主要核心是面向活动;
1、Webservice:效率不高基于soap协议,其主要的特点是跨语言、跨平台的。项目中不推荐使用,可用于不同公司间接口的调用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。restfull
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。使用Java语言开发,只能用于Java语言开发的项目间的通信,不具备跨语言,跨平台的特点!
WebService与Socket的区别(两种通信的方式)
-
Socket是基于TCP/IP的传输层协议。
Webservice是基于HTTP协议传输数据,http是基于tcp的应用层协议。
Webservice采用了基于http的soap协议传输数据。 -
Socket接口通过流传输,不支持面向对象。
Webservice 接口支持面向对象,最终webservice将对象进行序列化后通过流传输。
Webservice采用soap协议进行通信,不需专门针对数据流的发送和接收进行处理,是一种跨平台的面向对象远程调用技术。 -
Socket适用于高性能大数据的传输,传输的数据需要手动处理,socket通信的接口协议需要自定义。