我正在创建一个REST-API,并且遇到了客户端需要根据许多不同参数进行计算的问题。
此GET操作可能不是任何保存或更新操作的一部分(在GET之前或之后),并且可能以无状态方式发生。
由于这个原因,GET URL可能会很长(甚至超过浏览器允许的最大值)。
我已经在SO和其他地方查看了其他帖子,并且不鼓励在GET请求中使用正文。 但是对于所有这些帖子最重要的是,他们中没有一个能够替代这个问题他们只是说设计ETC中存在某些缺陷......等等......
这里的设计没有任何问题。它是一个建立在很多参数上的无状态计算。
我想要一些替代方案。谢谢。
答案 0 :(得分:1)
这里的设计没有问题
有。来自Wiki:
REST中的一个重要概念是资源的存在(特定信息的来源),每个资源都使用全局标识符(例如HTTP中的URI)引用。
您的计算参数与您发出请求的网址所标识的基础资源无关。您不是请求现有资源(因为这是GET
的用途,具体取决于您是否愿意解释REST),但某些计算将基于某些输入完成。这是远程过程调用,而不是REST调用。
您可以通过对Calculation
进行建模来更改您的方法,以便发送包含所有参数的POST /Calculations/
请求。
POST调用没有要求来更改服务器状态(即存储结果):
httpbis-draft, POST(其措辞和更新比RFC 2616更好):
POST方法请求目标资源处理 根据资源的请求包含在表示中的表示 具体的语义。
POST用于(以及其他):提供数据块,例如输入HTML的字段 形式,数据处理过程;
因此,您只需将计算结果与200
一起返回,或者您可以存储它们并返回200
,201
或204
,包含或指向计算结果,以便您稍后可以使用GET /Calculations/$id
。
答案 1 :(得分:0)
据我所知,您剩下的唯一解决方案是打破REST规则并使用POST请求。 POST可以有任意数量的参数,但它适用于REST中的“修改”操作。
与软件中的所有内容一样,规则可以帮助您避免错误。但是,如果规则阻止您解决问题,则需要稍微修改它们(或者为代码中明确定义的部分修改它们)。
确保每个人都了解您如何更改规则,新规则适用的位置(以及不适用的地方)。否则,下一个人将用他简单的测试用例“修复”你的“破解”代码。
答案 2 :(得分:0)
所以你想要一个接受有效载荷的安全HTTP方法。看看http://greenbytes.de/tech/webdav/draft-ietf-httpbis-method-registrations-14.html - SEARCH和REPORT都是理论上的候选人,如果你能忍受他们带来的WebDAV行李。
另一种方法是开始对这些进行概括或定义新内容(但不要忘记新的HTTP方法的定义需要IETF审核,请参阅http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-25.html#considerations.for.new.methods。