You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

openapi-core的validate_response方法未校验响应属性问题

问题:openapi-core响应校验仅验证状态码,不校验响应内容

一、API Schema定义

main.yaml

openapi: 3.0.1
info:
  title: blabla
  description: description

  termsOfService: 'TBD'
  contact:
    email: asd@email
  version: 1.1.9999
externalDocs:
  description: Find out more about Swagger
  url: 'http://swagger.io'
servers:
  - url: https://dummy_server.com/

tags:
  - name: login
    description: login


components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

paths:
  /local/sub/{user}/duration:
    $ref: './methods/local/sub-user-duration.yaml'

./methods/local/sub-user-duration.yaml

get:
  security:
    - bearerAuth: []
  tags:
    - duration
  summary: summ
  description: desc
  operationId: getDurationLimit
  parameters:
    - name: user
      in: path
      description: user
      required: true
      schema:
        type: integer
        format: int64
  responses:
    '400':
      description: Bad Request
      content:
        'application/json':
          schema:
            type: object
            properties:
              timestamp:
                type: string
              status:
                type: integer
              error:
                type: string
              path:
                type: string

二、Python校验代码

API调用代码

import requests

response = requests.post(url=url, params=query_params, headers=headers)

self.validate_request_swagger(response.request)
self.validate_response_swagger(response)

openapi-core校验逻辑

from openapi_core import Spec
from openapi_core import validate_request
from openapi_core import validate_response
from openapi_core.contrib.requests import RequestsOpenAPIRequest
from openapi_core.contrib.requests import RequestsOpenAPIResponse

def get_partner_spec(self):
    spec_ = Spec.from_file_path(str(self.get_project_root()) + "/docs/main.yaml")
    return spec_

def validate_request_swagger(self, request):
    request = RequestsOpenAPIRequest(request)
    validate_request(request=request, spec=self.get_partner_spec())

def validate_response_swagger(self, response):
    request = RequestsOpenAPIRequest(response.request)
    response = RequestsOpenAPIResponse(response)
    validate_response(response=response, spec=self.get_partner_spec(), request=request)

(注:原代码中from openapi_core.contrib语句不完整,已补全RequestsOpenAPIResponse的导入)

三、实际API响应内容

{
   "timestamp":"2023-03-03T11:26:26.293+00:00",
   "status":400,
   "error":"Bad Request",
   "path":"/local/sub/1647222638/duration"
}

四、问题现象

请求校验功能正常,但validate_response仅校验响应状态码:即使修改Schema中400响应的属性类型(比如把path设为integer),或者移除所有属性定义,校验仍然能通过,不会检测到响应内容不符合Schema的问题。


内容的提问来源于stack exchange,提问作者MG9901

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:00:29