下面的请求适用于三重转义字符但不适用于单个转义字符,因此如果我有以下内容:
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;。
答案 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