在RESTful api中返回什么&x27;我们有办法吗?

在RESTful api中返回什么&x27;我们有办法吗?,rest,asp.net-web-api,Rest,Asp.net Web Api,我对休息比较陌生,从一开始我就有一个问题 我直截了当地说,假设我有一个电子商务系统,所以我有一些“产品”,我也有这个资源:/api/products/1234在我的web api中,我向它发送一个GET HTTP请求 它应该返回什么?如果它返回整个实体,包括所有属性,那么在我只需要其中一些属性,而其他属性则无用的情况下,它是不合适的。例如,在某些场景中,我只需要“标题”和“价格”,因此,我不需要其他属性,这只是一种开销 如何处理 提前谢谢。我可以考虑两种处理方法 自定义媒体类型 您可以使用以下一

我对休息比较陌生,从一开始我就有一个问题

我直截了当地说,假设我有一个电子商务系统,所以我有一些“产品”,我也有这个资源:
/api/products/1234
在我的web api中,我向它发送一个GET HTTP请求

它应该返回什么?如果它返回整个实体,包括所有属性,那么在我只需要其中一些属性,而其他属性则无用的情况下,它是不合适的。例如,在某些场景中,我只需要“标题”和“价格”,因此,我不需要其他属性,这只是一种开销

如何处理


提前谢谢。

我可以考虑两种处理方法

自定义媒体类型 您可以使用以下一种(或两种)介质类型检索产品的完整表示形式:

GET/api/products/1http/1.1
主持人:example.com
接受:application/json
GET/api/products/1http/1.1
主持人:example.com
接受:application/vnd.company.full+json
和以下媒体类型,以仅检索产品的简短表示形式:

GET/api/products/1http/1.1
主持人:example.com
接受:application/vnd.company.short+json
查询字符串参数 或者,您可以支持使用查询字符串参数选择要检索的字段

使用以下内容检索产品的完整表示形式:

GET/api/products/1http/1.1
主持人:example.com
接受:application/json
以及以下内容,以仅检索产品的名称和价格:

GET/api/products/1?fields=name,price HTTP/1.1
主持人:example.com
接受:application/json
对于conveniece,尽管列出了字段,但始终可以返回产品的标识符


上述方法也可以应用于资源集合,例如
/api/products

正如埃弗特在评论中指出的那样,“发送所有东西是否真的会降低性能或带宽,这可能值得研究。如果没有重大成本,为了清晰起见,有时使用更胖的型号会更好。”


进一步引用唐纳德·克努特的话:。也就是说,没有衡量的性能问题,你不应该优化,因为你认为你会获得性能增益。可以执行一些明显的优化,但是在可以测量之前,应该避免任何不明显的优化。

我可以考虑两种方法来处理它

自定义媒体类型 您可以使用以下一种(或两种)介质类型检索产品的完整表示形式:

GET/api/products/1http/1.1
主持人:example.com
接受:application/json
GET/api/products/1http/1.1
主持人:example.com
接受:application/vnd.company.full+json
和以下媒体类型,以仅检索产品的简短表示形式:

GET/api/products/1http/1.1
主持人:example.com
接受:application/vnd.company.short+json
查询字符串参数 或者,您可以支持使用查询字符串参数选择要检索的字段

使用以下内容检索产品的完整表示形式:

GET/api/products/1http/1.1
主持人:example.com
接受:application/json
以及以下内容,以仅检索产品的名称和价格:

GET/api/products/1?fields=name,price HTTP/1.1
主持人:example.com
接受:application/json
对于conveniece,尽管列出了字段,但始终可以返回产品的标识符


上述方法也可以应用于资源集合,例如
/api/products

正如埃弗特在评论中指出的那样,“发送所有东西是否真的会降低性能或带宽,这可能值得研究。如果没有重大成本,为了清晰起见,有时使用更胖的型号会更好。”


进一步引用唐纳德·克努特的话:。也就是说,没有衡量的性能问题,你不应该优化,因为你认为你会获得性能增益。可以执行一些明显的优化,但在可以测量之前,应避免任何不明显的优化。

请记住,
/api/products/1234
标识的是资源,而不是实体。您的API可能有许多不同的资源来描述同一实体。看吉姆·韦伯的演讲

(还请注意,这是一种折衷,因为每个资源都有自己的缓存项——如果客户端修改一个资源,然后看到另一个资源描述同一实体的过时副本,这可能会很尴尬)

如果使用不同的参考资料方法,可以在URI中使用您喜欢的任何拼写变体。查询字符串是一种常见的选择,或者是路径段上的文件扩展名,甚至是生成一个单独的路径段。就我所知,选择之间唯一真正的区别是(RFC3986)在您的用例中是否有任何价值

它应该返回什么

一个常见的选择是使用模式。福勒写道

当您使用远程接口时,例如远程Facade(388),每次调用它都很昂贵。因此,您需要减少通话次数,这意味着您需要在每次通话中传输更多数据。一种方法是使用大量参数。然而,这对于编程来说往往很尴尬——事实上,对于像Java这样只返回一个值的语言来说,这通常是不可能的

解决方案是创建一个数据传输对象,该对象可以保存调用的所有数据

由于REST“设计为能够高效地进行大粒度超媒体数据传输”(),因此这种方法非常适合