Web Service原理

本质上来说,WebService就是提供一个数据服务,而其他客户端应用通过网络来获取数据,这些客户端可以是浏览器,可以是手机App,可以是桌面应用,可以是电视盒子,可以是智能手表。 请求服务和响应服务的数据格式由双方制定(实际上一般由服务方指定,客户端按照要求操作),可以是 HTML,可以是 JSON,也可以是XML等其他格式。 实现Web Service的技术架构主要有两种方式:

  • REST,使用统一的无状态操作集来表示web资源,目前的主要数据格式是JSON,但也可以使用XML。
  • 非REST,服务可以不使用统一的指令集,进行任意的组合操作,比如RPC。 概括下重点就是说:Web Service通过WSDL描述了一个网络通讯接口,其他的系统可以使用SOAP协议和web service交互数据,SOAP基于HTTP实现,并且使用XML来组织数据

Web Service协议(W3C Web Service)

WSDL

WSDL 是Web Service 的接口文档,和你在 Swagger 中看到的接口描述作用完全一样。通过WSDL,客户端知道该发送什么格式的请求数据,才能被服务正确解析。 WSDL(Web服务描述语言,Web Services Description Language)读作wiz-dəl,用来描述Web服务的公共接口。它描述了如何调用服务,需要什么参数,以及返回什么数据结构,它的用途大致类似于编程语言中对接口(interface)的类型说明。 一个WSDL的描述一般类似这样,实际编写时一般不需要手工填写,也不需要去深入看里面的构成,由工具生成就可以了。 在这个Demo网页中可以看到更多示例,之后会有具体的案例说明。

SOAP协议

SOAP 是一组标准的XML数据格式,通常在 HTTP 请求中传递。但其实除了HTTP以外,它也可以在SMTP、UDP、TCP等协议上传输,自然也可以用在web service上。也就是说,作为一种组装数据的格式,它是独立的。 看一个具体的例子,下面表示访问 InStock服务中的GetStockPrice接口,并且传递参数 StockName为 T。

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="http://www.example.org">
  <soap:Header>
  </soap:Header>
  <soap:Body>
    <m:GetStockPrice>
      <m:StockName>T</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>

从这个例子中可以看出,SOUP 消息内容是由 XML 编写的,主要分为几个部分:

  • Envelope,将XML文档标识为SOAP消息,必须
  • Header,消息头,可以不填。
  • Body, 包含需要调用的接口,参数以及响应信息,必须。
  • 还有一个 Fault,表示调用过程出错后的展示信息。

Web Service接口测试

根据上面的内容,大致梳理了 WSDL、SOUP、XML和HTTP的关系。 现在可以开始测试web service服务了。 1、在浏览器中查看一个WSDL描述文件, 也可以访问parasoft的示例网站获取更多WSDL文件。 2、在chrome浏览器中安装 Wizdler 插件或者 Boomerang,可以从WSDL中解析服务提供的接口,以及访问接口需要填写的参数类型。 3、点击接口名称,跳转到测试页面,修改请求参数。比如在 addInteger 接口中插入 12和13两个参数。 4、点击 Go 就可以往 Web Service 发送请求,得到响应结果。

Postman测试web service

使用Postman测试Web Service并无太大区别,还是读取WSDL文件,从中解析出每个接口需要传递的参数格式。

  • 在URL中填入服务地址
  • 请求方法选择POST请求
  • 请求格式选在 application/xml
  • 把WSDL生成的请求数据复制到body参数中

Python 测试 web service 接口

Python 测试 web service 接口和 postman 没什么区别,只是把界面操作转化成代码。 1.requests.post 可以直接发送 http 请求 2.准备好 SOUP 格式的请求体,传入 data 参数 3.请求头中把 content-type 修改成 appliction/xml

import requests

data = """\
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <getItemById xmlns="http://bookstore.parasoft.com/">
            <id xmlns="">1</id>
        </getItemById>
    </Body>
</Envelope>
"""
url = 'https://parabank.parasoft.com/parabank/services/store-01'
headers = {'content-type': 'application/xml'}
resp = requests.post(url, data=data,)
print(resp.text)

Python web service 常用库

zeep

import zeep
from zeep.wsse.username import UsernameToken  
from zeep.exceptions import Fault

def login():  
    wsdl = 'https://parabank.parasoft.com/parabank/services/ParaBank?wsdl'  
    client = zeep.Client(wsdl=wsdl, wsse=UsernameToken('jiasen', 'test'))  # 身份验证
    try:  
        resp = client.service.login('jiasen', '123456')  
    except Fault as fault:  
        print(f"Received SOAP Fault: {fault}")  # 异常处理  
    print(resp)  
  
  
def store():  
    wsdl = 'https://parabank.parasoft.com/parabank/services/store-01?wsdl'  
    client = zeep.Client(wsdl=wsdl)  
    resp = client.service.getItemById(1)  
    print(resp)  

Python请求webserver服务用到的suds、suds-jurko、zeep库

suds

suds-jurko