• 使用JSONSchema断言


    对于复杂的JSON结构,虽然可以使用JSONPath快速提取相应的值。然而对于JSON响应的整体结构和各字段类型,使用JSONSchema验证更加方便。
    安装方法:

    pip install jsonschema
    

    基本使用

    以上例中的响应结果为例:

    {
      "args": {
        "age": "12", 
        "name": "Kevin"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.22.0", 
        "X-Amzn-Trace-Id": "Root=1-5e7f618f-30ba932936a4a8e64ef5ea06"
      }, 
      "origin": "111.202.167.11", 
      "url": "https://httpbin.org/get?name=Kevin&age=12"
    }
    

    整个JSON结构可以描述为,整体为object类型,包含args、headers、orgin、url四个属性,其中args、headers是object类型,origin、url是字符串类型,使用JSONSchema语法描述如下:

    {
        "type": "object",
        "properties": {
            "args": {"type": "object"},
            "headers": {"type": "object"},
            "origin": {"type": "string"},
            "url": {"type": "string"}
        }
    }
    

    对于object对象,还可以使用required描述必须存在的属性。对于args、headers还可以继续添加properties描述其子属性,对于字符串还可以使用patten字段描述其符合的真正表达式。
    JSONSchema中的类型分为string、number、integer、array、object、boolean、null七种类型。其中,number包含整数和浮点数,integer仅限整数。JSONSchema每种类型常用的关键字如表3.3所示。

    Schema中常用的关键字

    最外层

    • $schema 指定使用的JSONSchema协议版本
    • title 规则标题
    • description 规则描述

    通用

    • type 类型,string、number、integer、array、object、boolean、null

    string

    • miniLength 最小长度
    • maxLength 最大长度
    • pattern 匹配的正则表达式

    number/integer

    • minimum 最小值, 结合"exclusiveMinimum": True,不包含等于
    • maximum 最大值,结合"exclusiveMaximum": True,不包含等于
    • multipleOf 可被指定数字整除

    object

    • properites 子属性
    • patternProperties 子属性名满足正则表达式
    • required 必选子属性

    array

    • items 子元素
    • required 必选子元素
    • miniItems 最少子元素个数
    • maxItems 最大子元素个数

    使用示例

    完整示例如下:

    import requests
    import jsonschema
    res = requests.get('https://httpbin.org/get?name=Kevin&age=12')
    schema = {
        "type": "object",
        "properties": {
            "args": {
                "type": "object",
                "required": ["name", "age"],
                "properties": {
                    "name": {"type": "string", "pattern": "^Kevin$"},
                    "age": {"type": "string", "pattern": "^12$"}
                }
            },
            "headers": {"type": "object"},
            "origin": {"type": "string", "pattern": "d{1,3}.d{1,3}.d{1,3}.d{1,3}"},
            "url": {"type": "string"}
        }
    } 
    jsonschema.validate(res.json(), schema)
    

    上例中,required限定,args必须有name和age两个子属性。
    name字段的pattern使用“^Kevin$”表示,必须以K开头,以n结尾,即完全等于Kevin。
    同样,断言通过时不会有任何输出,断言失败是则会抛出异常。

  • 相关阅读:
    一种无法被Dump的jar包加密保护解决方案
    基于设备指纹零感验证系统
    IOS防作弊产品技术原理分析
    某移动端防作弊产品技术原理浅析与个人方案构想
    web安全防御之RASP技术
    Linux漏洞分析入门笔记-Off-By-One(栈)
    smb中继学习
    Dedecms sp2 5.7 后台getshell审计
    phpmyadmin后台代码执行分析复现
    静态恶意代码逃逸-学习一
  • 原文地址:https://www.cnblogs.com/superhin/p/12596752.html
Copyright © 2020-2023  润新知