【问题标题】:Microsoft Graph Search Filter String in C#C# 中的 Microsoft Graph 搜索筛选字符串
【发布时间】:2018-05-11 20:54:03
【问题描述】:

下面的请求适用于三重转义字符,但不适用于单个转义字符,所以如果我有以下内容:

string filter = "\"category <> \"Person\" AND category <> \"Person 2\""

上面打印的字符串会给我们:

filter = "category <> "Person" AND category <> "Person 2""

这不起作用,但下面的过滤器定义将起作用:

string filter =
    "\"category <> \\\"Person\\\" AND category <> \\\"Person2\\\"\"";

List<QueryOption> options = new List<QueryOption>
{
    new QueryOption("$search", filter)
};

var messages = graphClient.Me
    .MailFolders
    .Inbox
    .Messages
    .Request(options)
    .Select("id, Categories, Subject")
    .Top(500)
    .GetAsync()
    .Result;

打印的这个过滤器给我们:

filter = "category <> \"Person\" AND category <> \"Person 2\""

为什么我们在 API 调用的打印字符串中包含一个 \?有人可以解释一下吗?

如果 \ 是 Microsoft Graph 中的转义字符,那么这是有道理的,但 Graph 中的转义字符是另一个“。”。

【问题讨论】:

    标签: c# microsoft-graph-api


    【解决方案1】:

    让我们从这里开始。

    new QueryOption("$search", filter)

    我们在这里做的是准备一个$search 过滤器,它将被附加到一个 url 的 GET 参数中......类似这样。

    https://...endpoint?$search=filter

    如果最终字符串中没有转义......它看起来像这样

    https://...endpoint?$search=category 人物 AND 类别 人物 2

    这不是很好。我们需要在字符串周围加上双引号

    https://...endpoint?$search=category "Person" AND category "Person 2"

    更好,但我们需要在整个过滤器周围加上引号

    https://...endpoint?$search="category "Person" AND category "Person 2""

    哇!现在我们的过滤器在开头和结尾包含双引号,以及嵌套字符串周围的双引号。好的,让我们转义内部双引号。

    https://...endpoint?$search="category \"Person\" AND category \"Person 2\""

    所以现在我们知道我们需要构建这个字符串。

    "类别 \"Person\" AND 类别 \"Person 2\""

    在 C# 中我们有几个选择...我们可以使用普通字符串,这意味着我们需要永远转义 \"

    var x = "\"category <> \\\"Person\\\" AND category <> \\\"Person 2\\\"";
    

    或者,您可以使用 Verbatim 字符串。它会减少转义的数量,因为您不需要转义斜线。在逐字字符串中,双引号被转义为 2 个连续的双引号

    var y = @"""category <> \""Person\"" AND category <> \""Person 2\""";
    

    【讨论】:

    • 谢谢 Eoin,这是发送给请求的最终 url 吗? "category \"Person\" AND category \"Person 2\"" ?
    【解决方案2】:

    您是否尝试过使用 Uri.EscapeDataString() 方法将字符串转义为 URL 友好字符?

    var filter = Uri.EscapeDataString($"\"category <> \"Person\" AND category <> \"Person 2\"");
    

    这会将字符串变成:

    %22category%20%3C%3E%20%22Person%22%20AND%20category%20%3C%3E%20%22Person%202%22
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多