在GET上发送大量参数数据的替代方法

时间:2014-01-13 13:47:38

标签: web-services http rest

我正在创建一个REST-API,并且遇到了客户端需要根据许多不同参数进行计算的问题。

此GET操作可能不是任何保存或更新操作的一部分(在GET之前或之后),并且可能以无状态方式发生。

由于这个原因,GET URL可能会很长(甚至超过浏览器允许的最大值)。

我已经在SO和其他地方查看了其他帖子,并且不鼓励在GET请求中使用正文。 但是对于所有这些帖子最重要的是,他们中没有一个能够替代这个问题他们只是说设计ETC中存在某些缺陷......等等......

这里的设计没有任何问题。它是一个建立在很多参数上的无状态计算。

我想要一些替代方案。谢谢。

3 个答案:

答案 0 :(得分:1)

  

这里的设计没有问题

有。来自Wiki

  

REST中的一个重要概念是资源的存在(特定信息的来源),每个资源都使用全局标识符(例如HTTP中的URI)引用。

您的计算参数与您发出请求的网址所标识的基础资源无关。您不是请求现有资源(因为这是GET的用途,具体取决于您是否愿意解释REST),但某些计算将基于某些输入完成。这是远程过程调用,而不是REST调用。

您可以通过对Calculation进行建模来更改您的方法,以便发送包含所有参数的POST /Calculations/请求。

POST调用没有要求来更改服务器状态(即存储结果):

  

httpbis-draft, POST(其措辞和更新比RFC 2616更好):

     
      
  • POST方法请求目标资源处理   根据资源的请求包含在表示中的表示   具体的语义。

  •   
  • POST用于(以及其他):提供数据块,例如输入HTML的字段     形式,数据处理过程;

  •   

因此,您只需将计算结果与200一起返回,或者您可以存储它们并返回200201204,包含或指向计算结果,以便您稍后可以使用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