基于URL中的代理代码(agencycode)实现API管理后端路由策略
基于URL中的代理代码(agencycode)实现API管理后端路由策略
我来帮你一步步拆解怎么在API Management里实现这个需求,刚好之前我配置过类似的场景,上手很简单:
先理清楚核心需求细节
- 你的请求URL格式是
http://tst.my.api.identity.xxx.com/int/my/v1/{AGENCYCODE}/system/ping - APIM里的API后缀是
int/my/v1,需要从URL里精准提取中间的{AGENCYCODE}值 - 要根据提取到的agencycode,把请求转发到对应的后端服务,同时重写请求路径,让后端收到的是
/system/ping这类不含agencycode的路径
核心实现思路
咱们可以用APIM的入站策略组合来搞定:先提取agencycode变量,再根据这个变量匹配对应后端,最后重写请求路径。完全可以基于你提到的负载均衡策略思路改造,核心是用set-variable提取值、choose做分支路由、rewrite-uri调整路径。
完整的策略配置示例
把这段配置放到你的API的入站策略里就行,每部分我都加了注释:
<policies> <inbound> <base /> <!-- 第一步:从URL路径中提取agencycode --> <set-variable name="agencyCode" value="@( // 把请求路径拆分成数组,比如路径是/int/my/v1/abc123/system/ping,拆分后得到各段 var pathSegments = context.Request.Url.Path.Split('/').Where(s => !string.IsNullOrEmpty(s)).ToArray(); // 取第4段(数组从0开始计数:int是0,my是1,v1是2,abc123是3) pathSegments.Length >=4 ? pathSegments[3] : string.Empty )" /> <!-- 第二步:根据agencycode匹配对应的后端服务 --> <choose> <when condition="@(context.Variables.GetValueOrDefault<string>("agencyCode") == "AGENCY1")"> <set-backend-service backend-id="backend-agency1" /> </when> <when condition="@(context.Variables.GetValueOrDefault<string>("agencyCode") == "AGENCY2")"> <set-backend-service backend-id="backend-agency2" /> </when> <!-- 可以继续添加更多agency的匹配规则 --> <otherwise> <!-- 没有匹配到agencycode时,设置默认后端或返回错误 --> <set-backend-service backend-id="backend-default" /> <!-- 也可以直接返回错误:<return-response><set-status code="404" reason="Agency code not found" /></return-response> --> </otherwise> </choose> <!-- 第三步:重写请求路径,移除agencycode部分,转发给后端 --> <rewrite-uri template="@( var pathSegments = context.Request.Url.Path.Split('/').Where(s => !string.IsNullOrEmpty(s)).ToArray(); if(pathSegments.Length >=5) { // 保留agencycode之后的路径部分,比如从/system/ping开始 return "/" + string.Join("/", pathSegments.Skip(4)); } // 路径不符合预期时,返回原路径做保底 return context.Request.Url.Path )" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
几个关键细节要注意
- 提取逻辑校验:这里的路径分段索引是根据你的URL结构来的,要是后续API后缀有调整,记得对应修改索引值,不然会提错agencycode。
- 后端提前配置:你得先在APIM里创建好各个agency对应的后端服务,策略里的
backend-id要和你创建的后端名称完全一致,不然会匹配失败。 - 异常场景处理:
otherwise分支里的默认后端或者错误返回,可以根据你的业务需求调整,比如有些场景下需要拦截无匹配的请求,直接返回400错误。
备注:内容来源于stack exchange,提问作者Riccardo79
相关产品推荐
相关产品推荐

