WebService

it2022-05-28  71

一、WebService简介

WebService(XML Web Service WebService)是一种可以接收并响应从Internet上的其他系统中传递过来的请求,轻量级的独立通讯技术。通过SOAP在Web上提供软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。WebService是一种跨编程语言和跨操作系统的平台的远程调用技术。


二、WebService三要素

SOAP(Simple Object Access Protocol)、WSDL(WebService Description Language)、UDDI(Universal Description Discovery and Integration)构成了WebService的三要素。下面详细阐述这三大技术。

2.1 SOAP

WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和接收的结果内容都采用XML格式进行封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP协议提供了标准的RPC(运程调用技术)方法来调用WebService。

SOAP协议组成: SOAP协议 = HTTP协议 + XML数据格式 SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,XML是SOAP的数据编码方式。
2.2 WSDL

好比我们去商店买东西,首先需要要知道商店的地址在哪里,商店有什么商品可以供我们购买,以及商品的价格等等。商家的做法就是贴一张商店商品的宣传海报。WebService也一样,WebService客户端要调用一个WebService服务,首先要知道这个WebService服务的地址在哪里,以及在这个WebService服务中我们可以调用哪些方法。所以WebService服务端首先要通过一个WSDL文件来说明自己有哪些服务可以供外界调用(就是对外界说明这个服务端中有哪些方法可以调用,方法的参数是什么,方法的返回值是什么等),以及说明服务的网络地址用哪个url表示,服务通过什么调用。

所以,简单来说,WSDL是一个基于XML语言,用于描述Webservice(函数、参数、返回值)的语言。它是WebService客户端和服务端都能理解的标准格式。

2.3 UDDI

UDDI是一个跨产业,跨平台的开发性架构,可以帮助Web服务提供商在互联网上发布Web服务的信息。UDDI是一种目录服务,企业可以通过UDDI来注册和搜索Web服务。简单来说,UDDI就是一个目录,只不过在各个目录中存放的是一些关于Web服务的信息而已。


三、WebService服务端开发步骤
3.1 开发接口
/** * 定义一个查询天气的服务 */ public interface IWeatherService { public abstract String query(String cityName); }
3.2 开发实现类
/** * @WebService表示该类为一个WebService服务 */ @WebService public class WeatherServiceImpl implements IWeatherService { @Override public String query(String cityName) { System.out.println("查询" + cityName + "的天气"); return "晴天"; } }
3.3 发布服务
import com.qf.webservice.WeatherServiceImpl; import javax.xml.ws.Endpoint; public class Main { public static void main(String[] args) { Endpoint.publish("http://localhost:8080/weatherService",new WeatherServiceImpl()); System.out.println("发布成功"); } }
四、WebService客户端开发
4.1 生成客户端代码
通过wsimport命令生成客户端代码(通过cmd进入到当前项目的src路径下) 第一种方式【远程地址】:wsimport -s . http://127.0.0.1:8080/weather?wsdl 第二种方式【xml文件】:wsimport -s . 文件路径(文件路径后面不需要加?wsdl)
4.2 客户端调用方式一
import com.qf.webservice.WeatherServiceImpl; import com.qf.webservice.WeatherServiceImplService; public class Client { public static void main(String[] args) { //1.创建视图(视图是从service标签中的name属性获取):<service name="WeatherServiceImplService"> WeatherServiceImplService service = new WeatherServiceImplService(); //2.获取服务的实现类(实现类从portType的name属性获取) WeatherServiceImpl service1Impl = service.getPort(WeatherServiceImpl.class); //3.调用方法 String weather = service1Impl.query("上海"); System.out.println(weather); } }
4.3 客户端调用方式二
import com.qf.webservice.WeatherServiceImpl; import com.sun.jndi.toolkit.url.UrlUtil; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; public class Client { public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8080/weatherService?wsdl"); QName qName = new QName("http://webservice.qf.com/", "WeatherServiceImplService"); Service service = Service.create(url,qName); //取得实现类 WeatherServiceImpl serviceImpl = service.getPort(WeatherServiceImpl.class); //调用方法 String weather = serviceImpl.query("北京"); System.out.println(weather); } }
4.4 访问服务的总结
目标:访问服务 1.生成客户端代码:wsimport -s . http://localhost:8080/weatherService?wsdl 2.查看服务的说明书(wsdl),例如:http://localhost:8080/weatherService?wsdl 3.按照服务的说明书进行编程: 1)取得服务视图:<service name="WeatherServiceImplService"> 2)取得服务的实现类:<portType name="WeatherServiceImpl"> 3)调用方法(服务):<operation name="query">
五、访问网络上提供的webservice服务(电话归属地)
1.通过服务的访问地址,来生成客户端代码

1)取得WSDL地址:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

2)根据WSDL地址生成客户端文件

2. 编写客户端代码调用服务提供的方法
import cn.com.webxml.MobileCodeWS; import cn.com.webxml.MobileCodeWSSoap; public class Client { public static void main(String[] args) { //1.生成服务视图:<wsdl:service name="MobileCodeWS"> MobileCodeWS service = new MobileCodeWS(); //2.创建服务视图的实现类对象:<wsdl:portType name="MobileCodeWSSoap"> MobileCodeWSSoap port = service.getPort(MobileCodeWSSoap.class); //3.调用方法:<wsdl:operation name="getMobileCodeInfo">或者<wsdl:operation name="getDatabaseInfo"> String info = port.getMobileCodeInfo("18252755498",null); System.out.println(info); } }
六、访问网络上提供的webservice服务(天气预报)
1.通过服务的访问地址,来生成客户端代码

1)取得WSDL地址:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

2)根据WSDL地址生成客户端文件 (1)问题:根据服务提供的WSDL文件进行解析过程中出现了错误 (2)原因:java调用.NET生成的webservice,生成客户端代码时报错(不同语言调用) (3)解决:因为这个服务时.NET开发的,所以我们需要将要访问wsdl描述文件保存到本地,然后做一些更改,具体如下:

将wsdl文件中的: <s:element ref="s:schema"/><s:any/> 修改为: <s:any minOccurs="2" maxOccurs="2"/> 然后,再以绝对路径的方式来生成对应的客户端代码即可(文件的后缀为:wsdl)

文件生成成功

2. 编写客户端代码调用服务提供的方法
import cn.com.webxml.WeatherWS; import cn.com.webxml.WeatherWSSoap; import java.util.List; public class Client { public static void main(String[] args) { //1.创建视图 WeatherWS service = new WeatherWS(); //2.创建视图的实现类 WeatherWSSoap port = service.getPort(WeatherWSSoap.class); //3.调用方法 List<String> info = port.getWeather("上海",null).getString(); for (String str : info) { System.out.println(str); } } }

最新回复(0)