2017-05-06 107 views
0

我正在研究Web Api应用程序,目前我正在努力理解RESTful API设计。REST - 查询字符串与URL路径

比方说,有一个发布资源/api/posts,我希望客户有机会请求当月的所有帖子。 从我的理解有两种方法来实现这一点。

一种方法是将当前月份作为资源。 另一种方式可能是Post资源的查询字符串。

什么是最好的(RESTful)方式来做到这一点?

api/posts/currentmonth

api/posts?stardate=???&enddate=???

回答

1

什么是最好的(REST风格)的方式来做到这一点?

REST不关心URI设计。

URI设计准则主要旨在让事情变得更容易;或者通过使拼写更易于推理,或者使路由实现更易于使用。

Alan Bates answered这在软件工程上非常透彻。总结:RFC 3986告诉我们层次属于路径,非层次数据属于查询。

一种方法可能是将当前月份作为资源。另一种方式可能是Post资源的查询字符串。

小心...

api/posts 
api/posts?stardate=???&enddate=??? 

这些都是不同资源,尽可能REST和REST风格的客户的关注。查询字符串是标识符的一部分。

说同样的事情用不同的方式

GET /api/posts?stardate=???&enddate=??? ... 

意味着

Resource(/api/posts?stardate=???&enddate=???).get() 

Resource(/api/posts).get(stardate=???&enddate=???) 
Resource(/api/posts).query(stardate=???&enddate=???).get() 

你的路由架构可转换前者为后者的一个,但是这是一个实现细节。 REST旨在将这些细节与接口分开,以便客户端和服务器可以独立进化。

为什么是api/posts和api/posts?stardate = ??? & enddate = ???不同的资源?我一直认为查询字符串只是查询资源的一种方式。

我的理解是,这种观点有些过时。

RFC 1630确实包括一个定义,与该解释

问号(“?”,ASCII 3F十六进制)对准用于分隔可查询对象的URI之间的边界,和一组用于表示对该对象的查询的单词。当使用这种形式时,组合的URI表示查询应用于原始对象所产生的对象。

但是,标准的语言是由我们得到了RFC 3986

组件包含数据路径的时间变化,通常是有组织的分层形式,在非分层查询数据沿,组件Section 3.4)用于标识URI的方案和命名权限(如果有的话)范围内的资源。

加上强调

资源的关键特征,如由调遣所描述的,是它们是抽象的。

REST使用资源标识符来标识组件间交互所涉及的特定资源。 REST连接器为访问和操作资源的值集提供了一个通用接口,而不管成员函数是如何定义的或处理请求的软件的类型如何。

换句话说,可能通过将一个查询的一个对象来产生所述表示,或者它可能通过访问文档存储时使用所述识别符作为密钥被生成 - 或在高速缓存中的条目。客户端(和中间组件)不需要知道任何有关它在接口后面隐藏的实现;他们只是确定他们感兴趣的概念图,并让服务器完成它的工作。

+0

感谢您的回答。为什么'api/posts'和'api/posts?stardate = ???&enddate = ???'不同的资源?我一直认为查询字符串只是查询资源的一种方式。 –