C#中的Microsoft图形搜索过滤字符串

时间:2018-05-11 20:54:04

标签: c# microsoft-graph

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

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中的转义字符是另一个&#34;。

2 个答案:

答案 0 :(得分:2)

让我们从这里开始。

new QueryOption("$search", filter)

我们在这里做的是准备一个$search过滤器,它将被附加到网址的GET参数上......就像这样。

https://...endpoint?$搜索=过滤

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

https://...endpoint?$ search = category&lt;&gt;人和类别&lt;&gt;人2

那不太好。我们需要围绕字符串的双引号

https://...endpoint?$ search = category&lt;&gt; &#34;人&#34;和类别&lt;&gt; &#34;人2&#34;

更好,但我们想要整个过滤器的引号

https://...endpoint?$ search =&#34; category&lt;&gt; &#34;人&#34;和类别&lt;&gt; &#34;人2&#34;&#34;

卫生署!现在我们的过滤器在开头和结尾包含双引号,以及嵌套字符串周围的双引号。好吧,让我们逃避内部双引号。

https://...endpoint?$ search =&#34; category&lt;&gt; \&#34;人\&#34;和类别&lt;&gt; \#34;人2 \&#34;&#34;

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

&#34;类别&lt;&gt; \&#34;人\&#34;和类别&lt;&gt; \#34;人2 \&#34;&#34;

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

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

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

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

答案 1 :(得分:0)

您是否尝试过使用 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