【问题标题】:Retrieve only specific properties with REST GET API使用 REST GET API 仅检索特定属性
【发布时间】:2017-02-10 09:50:44
【问题描述】:

我需要定义一个 REST API,它应该获取对象的唯一标识符并返回内容。内容是从数据库中检索出来的,是 JSON 类型的。 所以,我有一个这样的 REST URL -

GET /data/{typename}/{objectid}

这将返回整个对象内容。

但是,对象的内容可能很大,因此调用者可能只想指定一些或少数几个属性作为响应发送。 我的自然想法是在 GET API 中添加一个 BODY,用户可以在其中指定要检索的对象的属性名称列表。 但是在做一些进一步的研究时,似乎不建议使用带有 BODY 的 GET API。 我能想到的另一个选项是在查询字符串中传递属性名称 -

GET /data/{typename}/{objectid}?property=prop1&property=prop2...

但列表很容易变大。

关于我的 API 应该是什么样子的任何建议?我必须使用 POST 吗?

【问题讨论】:

  • 在您的情况下,排除属性会使 URL 更短吗?例如?excludes=thisProp,thatProp,anotherProp?
  • 这里关心的不是查询字符串的长度。问题在于了解如何传递会影响 GET API 响应的其他参数。

标签: rest asp.net-web-api2


【解决方案1】:

使用POST 是不正确的。只要您正在阅读,请使用GET。例如,Facebook 有一个类似的用例,其中/me 端点有很多过滤器,调用是GET

最终到达网址是 /me?fields=id,name,about,age_range,devices,currency,education

您可以从这里自己尝试 https://developers.facebook.com/tools/explorer/145634995501895/?method=GET&path=me%3Ffields%3Did%2Cname%2Cabout%2Cage_range%2Cdevices%2Ccurrency%2Ceducation&version=v2.8

从技术上讲,使用POST 会起作用,但这是一个非常糟糕的设计。

【讨论】:

  • 感谢您的回答。我确实觉得 POST 可能不是正确的方法。 facebook 示例让我确信查询字符串可能是正确的方法。但是我没有 facebook 登录,所以看不到它的实际效果,但我明白了要点。
  • 尽管您在技术上是正确的,对于检索数据,GET 请求是最正确的,但您确实对查询字符串长度有硬性限制,这可能是一个问题,例如使用数据表。 datatables.net/examples/server_side/post.html生成的查询字符串很快就达到了极限
  • 你认为','作为字段名称的分隔符会引起关注吗?
  • 一点也不,当你从GET请求中获取参数时,你会得到整个字符串。然后,您可以用逗号分隔以获取客户端想要读取的字段名称。我认为 Facebook API 我非常接近你想要的。
【解决方案2】:

我建议使用POST,因为GET 有长度限制。 What is the maximum length of a URL in different browsers?

否则你可以让你的查询字符串看起来像这样(对于数组) 这么近:)

GET /data/{typename}/{objectid}?property[]=prop1&property[]=prop2...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2017-01-07
    • 2015-05-19
    • 2016-02-06
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多