在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“设计为能够高效地进行大粒度超媒体数据传输”(),因此这种方法非常适合