我想寻求一些关于设计REST/hipermedia API的建议,特别是关于使用框架实现的建议。REST API - 媒体类型参数中的属性过滤器
取而代之的是一般的'实体'的例子,我会用一个更平凡的'文档'实体。
问题1:
GET /document/?[query]
得到的文件清单。问题在于“文档”只有几十个属性,在很多情况下,客户端只会关注少数几个(特别是在此次搜索中) - 响应的大小可能会有几个(最多10次)不等,而且服务器查询可能会更快。另外,我不得不提到,我们更喜欢无模式。
我发现样品如
GET /document/attr1, attr2../?[query]
我觉得这完全是非REST-FUL。
另一篇文章是建议使用内容类型(实际上接受,因为它是请求),但是例子丢失了,仍然有混合的感觉。喜欢的东西:
Accept: application/json; attrs="attr1,attr2"
我不知道这是否是尊重HTTP的语义,并且如果这种使用的媒体类型参数是合适的(毕竟我要资源的不同表现 - 与某些属性过滤掉)。
问题2:
如果上面或多或少aceptable的解决方案,我不知道是否有什么准备django-rest关于自定义介质类型的属性解析。从我在文档中可以看到的信息来看,媒体类型参数不是单独解析(或处理)的。
编辑
一些额外的信息:应用程序的很大一部分是OLTP(带不会缓存)。架构是带有静态文件的JSON服务器,JS重型客户端。
编辑2
其实,我发现了一些意见,在他们的自然搜索是新的(挥发性)资源(结果)创作,所以POST方法是比较合适的。这消除了讨论中的问题。我对创建的实体(结果)有一些问题,因为我不想坚持它,但我认为这不是强制性的。问题是要在“位置”标题中添加什么内容(伪造URL,没有位置标题或其他内容)?对我来说唯一一致的行为正是我不想做的 - 搜索POST执行搜索,将结果存储在服务器端并返回201并链接到它。然而,这是没有道理的持久负载...
关于浏览器测试,MIME类型text/html可能会提供一个用户友好的搜索表单。
完全正确。我忽略了一个问题,即大部分请求都会禁用缓存。尽管如此,它可能会启用,并且还会考虑REST设计的其他好处。在特定情况下,媒体类型参数的使用仍然存在问题(对于一般体系结构原则)。还有一个想法 - 媒体类型不应该影响缓存 - 如果它可以是json,xml或html,那么对同一个URL的调用如何被缓存? –
为了保持属性集合的可扩展性,你可以简单地考虑'GET/document /?[query]&attrs = attr1,attr2'。在Accept头文件中指定属性意味着您无法使用通用浏览器测试行为。关于媒体类型:如果您要返回同一资源的各种媒体类型的表示,则服务器需要发出“Vary:Accept”。这表示高速缓存分别存储不同的表示。在那个笔记上,我不相信每个缓存实现都知道如何处理媒体类型参数。 – fumanchu
经过一些想法实际上'GET/document/attr1,attr2 ../?[query]'比'GET/document /?[query]&attrs = attr1,attr2'要好于缓存(前提是通常每个客户端版本正在使用相同的顺序;据我所知,许多缓存代理忽略查询字符串)。 –