用GET更改服务器状态?

时间:2014-04-15 12:21:04

标签: api rest

好的,我知道这很糟糕。通常,GET请求应该是只读查询;他们不应该改变服务器及其数据的状态。但是我如何处理下一个情况?

客户必须提取所有聊天室"靠近他。这通常可能类似于GET /chatrooms?lat=x&lng=y。但是,如果他附近没有聊天室,那么必须自动创建一个房间。当然,这可以通过POST /chartrooms来实现。

但是这意味着向服务器提出2个请求,我只想做一个:GET /chatrooms?lat=x&lng=y然后如果没有房间,在服务器中创建一个新的并将其返回给客户端。因此,GET必须更改服务器中的状态(创建新房间)

服务器端将是这样的(伪代码):

@GET /chatrooms
List<ChatRoom> getAll():
    lat = getQuery("lat")
    lng = getQuery("lng")
    chatRooms[] = findChatRoomsByLatLng(lat, lng)
    if (chatRooms.size > 0): // This is the normal GET
       return json(chatRooms, 200)
    else   // In this case GET change the server state
       chatRoom = new ChatRoom(lat, lng)
       saveChatRoom(chatRoom)
       return json(chatRoom, 200)

这是我的问题。

1 个答案:

答案 0 :(得分:2)

你指的是GET作为“安全方法”的想法。 “安全”并不意味着“无法改变服务器状态”。这意味着“客户端无法使用 来请求更改服务器状态”。在您的情况下,更改显然由服务器完成,并且对用户完全不可见。这符合下面引用的RFC的最后一段。我发现使用GET创建相关聊天室(如果不存在)没有问题。

  

第9.1.1节安全方法

     

实施者应该知道该软件代表用户      他们在互联网上的互动,应该小心允许      用户要知道他们可能采取的任何行动      对自己或他人意想不到的重要性。

     

特别是,已经建立了GET和GET的惯例      HEAD方法不应该具有采取行动的意义      除了检索。这些方法应该被认为是“安全的”。      这允许用户代理表示其他方法,例如POST,PUT      和DELETE,以一种特殊的方式,使用户了解      事实上,正在要求采取可能不安全的行动。

     

当然,无法确保服务器不能      由于执行GET请求而产生副作用;在      事实上,一些动态资源考虑了一个功能。重要的      区别在于用户没有请求副作用,      所以不能对他们负责。