网络协议学习–SOAP协议(一)

2022-09-14 12:56:45 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

SOAP协议也是在学习onvif协议才学习到的知识点,感觉这个协议有点内容,所以单独拆分出来,介绍学习一下,都是新手,如果哪里讲的不对,请告诉我,反正我也不改。

简单来说,SOAP协议的组成,就是下面这个公式 SOAP协议 = RPC机制 HTTP传输协议 XML数据格式

首先它是一种RPC接口,那么第一个知识点来了,什么是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协议,因为大部分服务器,都支持这种简单的服务,环境简单,配置简单,工具成熟……

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两种方式。

XML格式

http只是传输的最外层协议,内部如何制定调用哪个端口,如何传递参数呢?SOAP协议采用了好看不中用的xml。尤其是搞c语言的,恨不得将xml打入18层冷宫,原因就是这个东西格式复杂,还需要额外的解析库来参与。

不过这个SOAP对xml的钟情,让我不得不介绍一下这个东西,还好soap对xml的需求不太深入,只是简单的用它来定义传输的内容。 这是一段SOAP的报文请求

XML里面定义了调用的函数,以及传入的两个参数,最终将这一段报文发送给服务端,就可以得到天气预报结果了

WSDL

此处再介绍一个概念,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协议的例子

POSTMAN模拟

说简单点,SOAP就是通过HTTP协议调用XML里面的函数,那么自然可以通过postman模拟http请求,来简单测试一下某些WSDL,就直接用前面的网站提供的手机号归属地查询来试一下吧 http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo

我们需要发送的请求为

代码语言:javascript复制
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

明天就是国庆节了,提前祝大家国庆快乐,坚守好最后一班岗

其实心里想的

网络协议学习–SOAP协议(二)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159718.html原文链接:https://javaforall.cn

0 人点赞