You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure APIM策略中特殊字符转义的问题求助

Azure APIM策略中特殊字符转义的问题求助

看起来你踩中了APIM策略里特殊字符(尤其是双引号)的经典坑!我之前帮好几个开发者解决过几乎一模一样的问题,咱们来一步步搞定它~

问题根源

你现在的写法是直接把Named Value拼在返回的字符串里,当ERP_UKG_pwd_TST里包含双引号时,替换后你的字符串会变成这样:

"username=xxx&password=abc"123&client_id=xxx&..."

双引号直接把C#的字符串提前终止了,APIM的表达式解析器自然会报“未终止的字符串字面量”错误。而且还有个隐藏问题:application/x-www-form-urlencoded格式本来就要求参数值必须做URL编码,特殊字符不编码的话,后端服务也可能解析不了你的请求。

最优解决方案:用URL编码处理所有特殊字符

直接对每个参数值做URL编码,这样不管是双引号、括号、小于号还是其他特殊字符,都会被转成符合规范的%xx格式,既解决了字符串语法问题,又符合HTTP协议要求。

把你的set-body代码改成这样:

<set-body>@{
    // 从配置里获取每个Named Value的原始值
    var username = Configuration.GetValue<string>("ERP_UKG_User_TST");
    var password = Configuration.GetValue<string>("ERP_UKG_pwd_TST");
    var clientId = Configuration.GetValue<string>("ERP_UKG_client_TST");
    var clientSecret = Configuration.GetValue<string>("ERP_UKG_secret_TST");
    
    // 对每个参数值进行URL编码
    var encodedUsername = Uri.EscapeDataString(username);
    var encodedPassword = Uri.EscapeDataString(password);
    var encodedClientId = Uri.EscapeDataString(clientId);
    var encodedClientSecret = Uri.EscapeDataString(clientSecret);
    
    // 拼接成最终的请求体
    return $"username={encodedUsername}&password={encodedPassword}&client_id={encodedClientId}&client_secret={encodedClientSecret}&grant_type=password&auth_chain=OAuthLdapService";
}</set-body>

为什么这个方法靠谱?

  1. 一劳永逸处理所有特殊字符:不管密码里有什么特殊字符,URL编码都能正确转义,不会再出现字符串语法错误。
  2. 符合HTTP规范application/x-www-form-urlencoded格式明确要求参数值必须编码,这样后端的OAuth服务才能正确解析你的请求参数。
  3. 避免手动转义的遗漏:如果手动去替换双引号,下次遇到<(或者其他特殊字符又要改代码,URL编码直接覆盖所有场景。

额外注意点

如果你的Named Value是从Key Vault引用的,完全不用担心APIM获取到的值有问题——APIM会直接拿到Key Vault里存储的原始值,咱们只需要在策略里做编码处理就够了。

你可以先把这段代码替换上去测试,应该能直接解决你的问题,如果还有其他细节需要调整,随时告诉我~

火山引擎 最新活动