代码之家  ›  专栏  ›  技术社区  ›  Kai Walter

如何在Azure API管理(C)策略表达式中应用HTML解码?

  •  1
  • Kai Walter  · 技术社区  · 6 年前

    我在HTTPPost主体中有有效负载,在转发到后端之前,我需要在特定字段上应用HTML解码。在system.web.httputility.htmldecode似乎不可用的api管理策略表达式中,如何实现这一点? - also see feedback forum ?

    尝试使用自制版本失败,因为策略编辑器转换 ä ä :

    <set-body>@{
        string HtmlDecode(string input) => input.Replace("&auml;","ä");
        var body = context.Request.Body.As<JObject>(true);
        body["field1"] = HtmlDecode(body["field1"].ToString());
        return body.ToString();
    }</set-body>
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Adam Weigert    6 年前

    由于API管理策略表达式支持xdocument,因此可以使用它来解码大多数HTML/XML数据块:

    string DecodeHtml(string value) { if (value == null) return null; return XDocument.Parse($"<root>{value}</root>").Root.Value; }

        2
  •  0
  •   Kai Walter    6 年前

    不是我的首选和预期解决方案,而是在@dana和maxim kim(API管理团队)的帮助下,一个解决方案:

    <set-body>@{
        Dictionary<string,string> decoderPairs = new Dictionary<string,string>() 
        {
            {"&amp;auml;","ä"},
            {"&amp;ouml;","ö"},
            {"&amp;uuml;","ü"},
            {"&amp;Auml;","Ä"},
            {"&amp;Ouml;","Ö"},
            {"&amp;Uuml;","Ü"},
            {"&amp;szlig;","ß"},
            {"&amp;amp;","&"}
        };                
        string HtmlDecode(string input) { foreach(var p in decoderPairs) { input = input.Replace(p.Key,p.Value); } return input; }
        var body = context.Request.Body.As<JObject>(true);
        body["field1"] = HtmlDecode((body["field1"] ?? "").ToString());
        return body.ToString();
    }</set-body>
    

    编辑

    既然这样 release 有合适的解决方案

    <set-body>@{
        var body = context.Request.Body.As<JObject>(true);
        body["field1"] = System.Net.WebUtility.HtmlDecode((body["field1"] ?? "").ToString());
        return body.ToString();
    }</set-body>