我是 azure APIM 的新手。我正在尝试实现这样的功能,我需要确保当客户端使用正确的订阅密钥发送请求并希望添加自定义标头以路由到适当的后端服务 URL 时。在不添加 Web 服务 URL 的情况下,我只有 API URL 后缀。 否则,我必须创建 10 个相同的 api,URL 几乎没有变化。
客户在他对基本 URL 的请求中添加自定义标头https://my-app-api.azure-api.net/api/customers
Ocp-Apim-Subscription-Key: Keys-for-auth
“X-subjectName”:我的主题值
当请求到达后端以使用该标头覆盖 URI 时,我需要从调用中提取自定义标头并覆盖后端 URI。我可以通过政策做到这一点吗?
覆盖我的后端 URI 后,它应该如下所示: https://my.api.com/api/v1/my-subject-value /customers
谢谢!
评论中的政策:
<inbound>
<set-variable name="myvar" value="@(context.Request.Headers.GetValueOrDefault("my-header",""))" />
<set-backend-service base-url="my-api-backend.com{{myvar}}" />
</inbound>
请这样获取变量的值:
context.Variables.GetValueOrDefault<string>("myvar")
使用 rewrite-uri 变量的值可以附加到 URL:
<inbound>
<set-variable name="myvar" value="@(context.Request.Headers.GetValueOrDefault("my-header",""))" />
<set-backend-service base-url="my-api-backend.com" />
<rewrite-uri template="@("/" + context.Variables.GetValueOrDefault<string>("myvar"))" copy-unmatched-params="false" />
</inbound>
请在下面找到一个完整的工作示例进行演示:
<policies>
<inbound>
<base />
<set-variable name="myvar" value="@(context.Request.Headers.GetValueOrDefault("my-header",""))" />
<rewrite-uri template="@("/?name=" + context.Variables.GetValueOrDefault<string>("myvar"))" copy-unmatched-params="false" />
<set-backend-service base-url="https://api.agify.io" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
带有自定义标头的请求:
跟踪结果: