API Management始终返回200而非实际响应,求问题排查
以下是可能导致仅返回HTTP 200但无实际响应数据的原因及排查方向:
1. 路径重写逻辑异常
你的rewrite-uri策略仅替换路径中的/pml为/api,如果请求路径不包含/pml,重写后的路径会和原请求路径完全一致。若后端服务要求路径必须以/api开头,此时请求会命中后端的默认空响应接口(比如根路径/),从而返回空的200响应。
可以修改重写逻辑,确保无论原路径是否包含/pml,都能正确映射到后端的/api路径,示例:
<rewrite-uri template="@(context.Request.Url.Path.StartsWith("/pml") ? context.Request.Url.Path.Replace("/pml","/api") : $"/api{context.Request.Url.Path}")" />
2. 操作URL模板的匹配冲突
你配置的两个操作(Get/Post)URL模板均为/*,APIM的操作匹配按定义顺序执行,虽然Get和Post请求会分别匹配对应操作,但/*的模糊模板可能导致路径解析时丢失信息,或APIM路由时未正确传递完整路径到后端。
建议将操作URL模板调整为更具体的格式,比如/pml/*(对应你要替换的前缀),确保请求路径被正确识别并传递给重写策略处理。
3. 后端服务本身返回空内容
跳过APIM,直接用Postman调用后端服务的目标路径,确认是否能返回正常数据。如果后端直接调用也返回空的200,问题出在后端服务本身,与APIM配置无关。
4. 响应内容被APIM截断或未正确转发
检查APIM的outbound策略是否继承了产品或全局的默认规则,可能存在修改、过滤或清空响应内容的配置。可以临时在outbound中添加显式策略强制返回后端响应,示例:
<outbound> <base /> <return-response> <set-body>@(context.Response.Body.As<string>())</set-body> </return-response> </outbound>
若测试后能返回数据,说明原有outbound策略存在异常。
5. 请求头或内容协商问题
确认Postman请求中的Accept头是否与后端服务支持的响应类型一致。如果后端仅返回application/json,但请求头是text/plain,可能导致后端返回空内容或默认响应。同时检查APIM是否修改了Accept或Content-Type请求头,可在inbound中添加策略保留原始请求头:
<inbound> <base /> <set-backend-service base-url="my site" /> <set-header name="Accept" exists-action="override">@(context.Request.Headers.GetValueOrDefault("Accept", ""))</set-header> <rewrite-uri template="@(context.Request.Url.Path.Replace("/pml","/api"))" /> </inbound>
内容的提问来源于stack exchange,提问作者Paul

