Azure OpenAI Swagger转YAML后APIM请求验证失败问题排查
将Azure OpenAI API 2023-07-01-preview版本的Swagger从JSON转换为YAML后导入Azure APIM,并配置了以下validate-content验证策略:
<validate-content unspecified-content-type-action="ignore" max-size="102400" size-exceeded-action="detect" errors-variable-name="requestBodyValidation"> <content type="application/json" validate-as="json" action="prevent" allow-additional-properties="false" /> </validate-content>
发送符合接口定义的请求体时,APIM返回如下错误:
{ "statusCode": 400, "message": "Body of the request does not conform to the definition which is associated with the content type application/json. JSON does not match all schemas from 'allOf'. Invalid schema indexes: 0, 1. Line: 42, Position: 1" }
但直接调用Azure OpenAI原生接口时该请求可正常执行,请问可能的问题原因是什么?
Swagger转换过程中的Schema失真
从JSON转YAML时,可能出现allOf组合Schema的格式错误,比如嵌套结构缩进错误、Schema引用路径丢失或格式变化。Azure OpenAI的原生Schema中allOf可能包含多个子Schema,转换后APIM无法正确解析这些子Schema的关联关系,导致验证失败。APIM与原生接口的验证逻辑差异
Azure OpenAI原生接口对allOf的验证可能采用宽松逻辑(比如允许请求体满足部分子Schema即可),但APIM的validate-content策略严格遵循JSON Schema规范,要求allOf下的所有子Schema必须完全匹配。如果请求体仅满足部分子Schema,就会触发APIM的验证错误,但原生接口可正常处理。allow-additional-properties="false"限制过严
若原生接口实际允许一些未在Swagger中定义的额外属性,而APIM的验证策略设置allow-additional-properties="false",会将这些额外属性判定为不符合Schema。但原生接口可能自动忽略这类属性,因此请求可以正常执行。Swagger导入时的Schema引用解析失败
导入YAML格式的Swagger到APIM时,原生Swagger中的$ref引用可能在转换或导入后无法正确指向对应的子Schema,导致APIM无法构建完整的验证Schema,进而触发allOf验证失败。
内容的提问来源于stack exchange,提问作者Jayendran

