JavaEE-远程调用技术-WebService之客户端的调用
概述
But
- 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了
- 大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层 的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP 协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议
- 既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用 什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!
所谓服务:部署在服务器中为我们提供请求响应的程序
所谓协议:双方规定一种通信的方式
复杂的网络应用:
WebService定义: 顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用
Webservice理解:我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下服务器上的一段代码而已。WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样
WebService调用
传统_远程方法调用
socket:可以做远程方法调用,但是协议太底层化,太麻烦
http:可以做远程方法调用,但是协议需要通过双方确定,太麻烦
http有Post请求和Get请求
使用http的Post请求:
POST xxx.action HTTP1.1
host: www.xxx
content-type:"text/html;charset=UTF-8"
name=zhangsan&age=20
使用http的Get请求
GET xxx.action?name=zhangsan&age=20
HTTP1.1
host: www.xxx
content-type:"text/html;charset=UTF-8"
webservice基于的soup协议
POST xxx.action HTTP1.1
host: www.xxx
content-type:"text/xml;charset=UTF-8"
<envolpe>
<body>
<name>zhangsan</name>
</body>
</envolpe>
webservice使用的协议是soap的协议,这种协议是在HTTP的协议上做的
它和HTTP的区别:
传输的内容是xml
webservice特点:
1.远程方法的调用
2.异构系统之间的调用
WSDL解析
WSDL – WebService Description Language – Web服务描述语言
它的作用相当于服务端的方法调用的说明书,你需要以说明书的约束发送消息体给服务端,然后服务端给你响应
通过XML形式说明服务在什么地方-地址
通过XML形式说明服务提供什么样的方法 – 如何调用
相当于服务端给客户端提供的一个说明书
约束了客户端和服务端之间通信的消息格式
以下是一个服务完整的WSDL文档
service:
服务访问点的集合元素,元素的name属性很重要,调用时需要使用
port:
服务访问点元素的name属性调用时需要使用, binding属性指定了服务访问点和服务类绑定元素
binding:
把服务访问点和服务类绑定在一起,不需要关心元素的内部,要关心的就是他的type属性,这个属性指定了绑定的服务类xml元素(portType)
portType:
具体的服务类的元素,在portType内部有n个operation
operation:
就是服务类中的方法
message:
输入输出的消息体,分别对应着服务端接收的参数和响应的返回值,我们前面说了消息是以soap为协议,这个协议是http方式的请求,请求体式xml,这个xml不能随便写,需要约束使用schema
types:
对输入输出的消息体的约束schema
消息体:
webservice实际是通过网络根据soap的协议传输数据,我们不可以去自己组装消息体,因为太复杂太繁琐
调用手机号码归属地查询服务
- 打开
http://www.webxml.com.cn/zh_cn/web_services.aspx
- 复制wsdl
- 生成客户端代码
打开cmd,在任意新建目录下输入指令
wsimport -s . -p com.mobile http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
自动生成的客户端代码如下
- 将代码拖入IDEA
- 在主函数中编写如下代码(根据注释查wsdl文档即可)
package com;
import com.mobile.MobileCodeWS;
import com.mobile.MobileCodeWSSoap;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.*;
class Main{
public static void main(String[] args) {
//1.创建服务访问点集合对象
MobileCodeWS mc = new MobileCodeWS() ;
//2.获得服务点绑定的类,使用get加上port的名字
MobileCodeWSSoap ms = mc.getMobileCodeWSSoap() ;
//3.调用服务端的方法
String resulet = (String) ms.getMobileCodeInfo("18687451369",null);
System.out.println(resulet);
}}
电话号码是我随便乱写的