大家好,又见面了,我是你们的朋友全栈君。
SOAP协议也是在学习onvif协议才学习到的知识点,感觉这个协议有点内容,所以单独拆分出来,介绍学习一下,都是新手,如果哪里讲的不对,请告诉我,反正我也不改。
简单来说,SOAP协议的组成,就是下面这个公式 SOAP协议 = RPC机制 + HTTP传输协议 + XML数据格式
首先它是一种RPC接口,那么第一个知识点来了,什么是RPC
RPC:(Remote Procedure Call)远程调用。与之类似的还有一种叫LPC(Local Procedure Call)本地调用,二者的区别就在于执行单元,一个在本地,一个在远端。
拿C语言的函数来举例 本地调用:通常,在我们的代码中调用一个函数,这个函数要么是系统API,要么是我们自己实现的本地代码,一起编译,一起发布,也在同一个进程中一起执行,这就是本地调用! 例如为了计算1+1,我们开发了如下程序
,其中calc_plus函数,在main函数之前实现,或者在其他库中实现,被我们调用,那么执行main的时候,我们就直接访问calc_plus函数的地址,直接得到运算结果。
远程调用:被调用方法的具体实现不在同一个进程,而是在别进程,甚至别的电脑上。RPC一个重要思想就是,使远程调用看起来像本地调用一样,调用者无需知道被调用接口具体在哪台机器上执行。
还是计算1+1我们发现计算1+1太占用CPU资源了,公司只有一台这样的电脑,那么我们就将这台电脑作为一台服务器,提供calc_plus这个功能,如果别人想计算怎么办,那就通知这台电脑,我调用calc_plus函数,传入参数1和参数1。
这样就皆大欢喜了,我们都能尽情计算1+1了。
那么接着就会遇到问题,这个链接怎么建立,用什么协议传输呢,SOAP协议采用了HTTP协议,因为大部分服务器,都支持这种简单的服务,环境简单,配置简单,工具成熟……
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP),它是基于请求-响应的模式协议,客户端发出请求,服务器端给出响应并返回请求内容。
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
方法 | 含义 |
---|---|
GET | 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问 |
HEAD | 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据) |
POST | 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有 |
PUT | 向指定资源位置上传其最新内容 |
DELETE | 请求服务器删除Request-URI所标识的资源 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
OPTIONS | 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器) |
方法这么多,其实常用的也就是GET和POST,SOAP协议使用到的也就是GET和POST两种方式。
http只是传输的最外层协议,内部如何制定调用哪个端口,如何传递参数呢?SOAP协议采用了好看不中用的xml。尤其是搞c语言的,恨不得将xml打入18层冷宫,原因就是这个东西格式复杂,还需要额外的解析库来参与。
不过这个SOAP对xml的钟情,让我不得不介绍一下这个东西,还好soap对xml的需求不太深入,只是简单的用它来定义传输的内容。 这是一段SOAP的报文请求
XML里面定义了调用的函数,以及传入的两个参数,最终将这一段报文发送给服务端,就可以得到天气预报结果了
此处再介绍一个概念,WSDL(Web Services Description Language,网络服务描述语言),因为前面我们把RPC的功能说清了,远程过程调用的是C函数,那么我们就需要知道都有那些C函数,需要传输那些参数,名字都是什么?这让我们想起了熟悉的头文件,没错,WSDL就是SOAP的头文件,是一种xml格式定义的,介绍SOAP协议结构的文件。简单来做个对比
意思就是,我们知道了服务器地址,再拿到这个WSDL文件,就知道怎么调用服务器里面的函数,传递哪些参数,收获那些结果。
在这里推荐一个webservice的提供网站,http://www.webxml.com.cn/zh_cn/web_services.aspx 啥?webservice,webservice中就包含了SOAP,就是用web提供功能服务,这里暂不深入,只需要知道,websevice是RPC的一种,SOAP是webservice的一种即可。 这个测试网站,提供了一个天气预报的服务
那么这里我们访问第一个web服务,然后再访问
这里就可以看到一个完整的soap协议的例子
说简单点,SOAP就是通过HTTP协议调用XML里面的函数,那么自然可以通过postman模拟http请求,来简单测试一下某些WSDL,就直接用前面的网站提供的手机号归属地查询来试一下吧 http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
我们需要发送的请求为
POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: ws.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getMobileCodeInfo xmlns="http://WebXml.com.cn/">
<mobileCode>string</mobileCode>
<userID>string</userID>
</getMobileCodeInfo>
</soap12:Body>
</soap12:Envelope>
postman中header主要修改点在于下面两点
body部分用raw方式发送
然后可以得到结果了
最后要鸣谢一位专家及其作品,这个介绍IPC摄像头的文章,如果要学习,必须拜读一下。 许振坪 https://blog.csdn.net/benkaoya/article/details/72424335
明天就是国庆节了,提前祝大家国庆快乐,坚守好最后一班岗
其实心里想的
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159718.html原文链接:https://javaforall.cn