【问题标题】:How to escape odata uri segment starting dollar sign ($)如何转义以美元符号 ($) 开头的 odata uri 段
【发布时间】:2019-08-26 16:23:28
【问题描述】:

运行此查询:

https://someurl.com/graph/users/%24myuser%40myorg.org/licenseDetails?$select=skuId,skuPartNumber”

结果:

"请求 URI 无效。由于段 'users' 指的是一个集合,所以这必须是请求 URI 中的最后一个段,或者它后面必须跟一个可以绑定到它的函数或操作,否则所有中间段必须引用单个资源"

经过一番尝试,我设法通过在 myuser 之前添加第二个美元符号 (%24) 来使其工作。

这似乎没有很好的记录,即使在这里https://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/abnf/odata-abnf-construction-rules.txt

是否有一个 c# 库可以正确地为 odata 转义给定的文字字符串,而不是每个人不时手动遇到问题?

难道不应该针对这些似乎没有记录的特殊情况改进文档吗?

【问题讨论】:

  • 我希望您通过/users('myuser@myorg.org')/licenseDetails获得特定用户的licenseDetails
  • 刚刚用 /users('$myuser@myorg.org')/licenseDetails 尝试过,因为我的用户以 $ 开头并且它似乎可以工作。我不知道这种语法,谢谢!

标签: c# odata


【解决方案1】:

OData url 中的 $ 前缀通常表示您将要使用系统查询选项,例如 $filter$select$expand。这可能会导致您的密钥被这样解释。

由于您使用实体键来访问特定实体,然后导航到其中一个导航属性,因此您通常可以直接在实体的括号内提供键。当您没有复合键时,这很简单,如下所示:

/users('my-key-value')

然后,您可以展开特定的导航属性并选择特定的属性(假设实现与此兼容),方法与您之前尝试的方式相同,从而导致

/users('$myuser@myorg.org')/licenseDetails?$select=skuId,skuPartNumber

【讨论】:

    【解决方案2】:

    正如 Jonathon Chase 所说,您可以使用 /users('$myuser@myorg.org')/licenseDetails 作为替代语法。

    【讨论】:

      猜你喜欢
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2015-06-17
      • 2021-07-01
      相关资源
      最近更新 更多