2010-10-01 65 views
6

我们正在设计一个iPhone应用程序,该应用程序将回调到Tomcat中运行的RESTful服务。我们需要发送很多查询参数,并超过了手机允许的最大值。使用* many *参数调用RESTful服务

即使在不修改服务器的意图,是否使用与正文中的参数PUT调用RESTful? POST似乎不正确,因为它不是幂等的,而PUT是(因此更类似于GET的行为)。

谢谢。

+0

它是JSON还是XML? – Aliostad 2010-10-01 17:47:08

+4

REST的原则和精神比你的产品更重要。因此,您的产品不应该存在。 Mark 2010-10-01 17:47:59

+3

@Mark:非常好。如果你不能遵循法律的精神,就停止发展!为什么我没有想到这个?我现在正在给我的老板打电话,告诉他这个疯狂的数据模型不适合Chen所说的原始关系模型,我们应该停止工作。优秀! – 2010-10-01 17:52:22

回答

4

如果你想要它RESTful,你可以这样做:将参数传递给服务器(在你选择的位置),或者你可以发布它们并让服务器为你放置它们。无论哪种方式,您已经创建了一个可以保存所需参数的资源。然后你发送一个指向那个特定资源的GET。因此,在回答您的GET时,服务器知道从哪里获得大量参数。这将是RESTful。

也就是说,发送两个请求不是很有效率,如果你可以用一个请求做同样的事情。我只是想尽量务实。

考虑一下:PUT告诉代理他们不应该缓存响应,但是重试(通过线上的任何基础设施元素)肯定是可能的,因为它是幂等的(就像GET一样)。 GET通过PUT提供了什么?响应可以被缓存。但是有了这么多的参数,我认为无论如何大多数请求都是唯一的,对吧?因此,缓存不会经常带来很多报酬。因此,使用PUT似乎是务实的,因此是正确的选择。

+0

正如我在之前的评论中所说的,我们有很多参数的原因是每个参数都是iPhone上已有记录的ID。我们正试图阻止重新刷新这些记录。您关于不缓存和唯一性的评论是apropos。 – Ralph 2010-10-04 11:45:32

1

它违反了REST的精神,但如果它有效,就要务实。

+0

有没有RESTful的方法来做到这一点?我不是法律信函(或本案中的规范)的坚守者,但是如果有任何方法,我想遵循标准。 – Ralph 2010-10-01 17:55:23

6

您必须最大程度地符合性与HTTP三种选择:

首先,你必须发送您的PARAMS以某种方式压缩,形成一个较短的URL的选项。

二,也没什么可说GET,说你不能在请求发送消息体,在任何Content-Type-Length您选择。并非所有的服务器都支持这一点,但HTTP协议本身就是如此。

第三,你可以发布参数到/queries/资源,并与201 Created作出回应,并在Location响应头一个新的URL(如/queries/78a65g82),其中客户端然后(反复,甚至Ranges调用GET ,如果这是一个好处)来检索结果。

+4

我想你可能会发现一些代理不会转发GET请求的主体。 – 2010-10-01 19:33:45

+0

像Darrel一样,你不应该传递GET消息 - 有效载荷,它可以在你的dev-setup中工作,但可以在你的prod-setup中崩溃。这太不可靠了,路由(以及涉及的代理)通常不在您的控制之下。 – 2010-10-02 15:34:47

+0

对于/ queries/78a65g82建议+1,这是我们使用的。 – balupton 2010-10-03 12:27:13