Azure API Manager新门户Try it请求失败,旧门户及Postman正常
新Azure API Manager门户Try it功能请求体格式异常导致500错误的解决思路
迁移至新Azure API Manager门户后,多数功能运行正常,但部分端点出现异常:例如获取认证令牌的POST端点,在旧门户使用Try it功能可返回200响应,新门户执行完全相同的请求却返回500错误(提示“Unable to complete the request”),但在Postman中请求该端点完全正常。
通过开发者工具对比请求内容发现,旧门户将JSON格式的请求体直接发送,而新门户把请求体封装成了Buffer类型的对象,且目前未找到可调整该行为的配置选项。
旧门户请求示例
{"headers":[{"name":"Host","value":"blahblah.azure-api.net"},{"name":"Content-Type","value":"application/json"},{"name":"Ocp-Apim-Subscription-Key","value":"blahblahblah","secret":true}],"httpMethod":"POST","host":"blahblah.azure-api.net","path":"blah/auth/creds","scheme":"https"} Content-Disposition: form-data; name="body"; filename="blob" Content-Type: application/json { "client_id": "XXXXXXXXX", "client_secret": "XXXXXXXXXX" }
新门户请求示例
Content-Disposition: form-data; name="requestPackage"; filename="blob" Content-Type: application/json {"url":"https://blahblah.azure-api.net/blah/auth/creds","method":"POST","headers":[{"name":"Content-Type","value":"application/json"},{"name":"Ocp-Apim-Subscription-Key","value":"blahblahblah"}],"body":{"type":"Buffer","data":[123,10,32,...tons more data here......125]}}
解决建议
- 检查API定义:确认该端点的OpenAPI/Swagger定义中,请求体的
content-type明确设置为application/json,且JSON Schema无语法错误。新门户的Try it功能对API定义的兼容性要求更严格,定义不规范可能触发格式转换异常。 - 添加APIM入站策略转换请求体:通过策略将Buffer格式的请求体还原为JSON字符串,示例策略如下:
<inbound> <base /> <choose> <when condition="@(context.Request.Body.As<JObject>()["type"]?.ToString() == "Buffer")"> <set-body>@{ var bufferData = context.Request.Body.As<JObject>()["data"].ToObject<int[]>(); return Encoding.UTF8.GetString(bufferData); }</set-body> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> </when> </choose> </inbound>
- 临时替代方案:暂时使用Postman、curl等第三方工具完成API测试,避开新门户Try it的格式问题。
- 反馈Azure支持:若上述方法无效,直接提交Azure支持工单,提供新旧门户的请求对比信息,推动官方修复该兼容性问题。
内容的提问来源于stack exchange,提问作者Blingers
相关产品推荐
相关产品推荐

