好的,我知道这很糟糕。通常,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)
这是我的问题。
答案 0 :(得分:2)
你指的是GET作为“安全方法”的想法。 “安全”并不意味着“无法改变服务器状态”。这意味着“客户端无法使用 来请求更改服务器状态”。在您的情况下,更改显然由服务器完成,并且对用户完全不可见。这符合下面引用的RFC的最后一段。我发现使用GET创建相关聊天室(如果不存在)没有问题。
第9.1.1节安全方法
实施者应该知道该软件代表用户 他们在互联网上的互动,应该小心允许 用户要知道他们可能采取的任何行动 对自己或他人意想不到的重要性。
特别是,已经建立了GET和GET的惯例 HEAD方法不应该具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如POST,PUT 和DELETE,以一种特殊的方式,使用户了解 事实上,正在要求采取可能不安全的行动。
当然,无法确保服务器不能 由于执行GET请求而产生副作用;在 事实上,一些动态资源考虑了一个功能。重要的 区别在于用户没有请求副作用, 所以不能对他们负责。