Api 使用GET更改服务器状态?

Api 使用GET更改服务器状态?,api,rest,Api,Rest,好吧,我知道这很糟糕。一般来说,GET请求应该用于只读查询;它们不应更改服务器及其数据的状态。但是我如何处理下一种情况呢 客户必须找到他附近的所有“聊天室”。这通常类似于GET/chattrooms?lat=x&lng=y。但是,如果他附近没有聊天室,那么必须自动创建聊天室。当然,这可以通过POST/chartrooms实现 但这意味着对服务器有两个请求,我只想做一个:aGET/chattrooms?lat=x&lng=y,然后如果没有房间,在服务器中创建一个新房间并将其返回给客户端。因此,GE

好吧,我知道这很糟糕。一般来说,GET请求应该用于只读查询;它们不应更改服务器及其数据的状态。但是我如何处理下一种情况呢

客户必须找到他附近的所有“聊天室”。这通常类似于
GET/chattrooms?lat=x&lng=y
。但是,如果他附近没有聊天室,那么必须自动创建聊天室。当然,这可以通过
POST/chartrooms
实现

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

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

@GET/chattrooms
List getAll():
lat=getQuery(“lat”)
lng=getQuery(“lng”)
聊天室[]=FindChatRoomsBylatelng(lat,lng)
if(chatRooms.size>0)://这是正常的GET
返回json(聊天室,200)
else//在本例中,获取并更改服务器状态
聊天室=新聊天室(lat,lng)
存储聊天室(聊天室)
返回json(聊天室,200)

这就是我的问题。

如果请求的房间不存在,只需创建房间并返回即可。客户甚至不应该注意到这一点。得到就可以了


它就像动态生成的图像,比如缩略图或者其他什么。您会发送两个请求来下载动态生成的图像吗?我不会这样做。

如果请求的房间不存在,只需创建房间并返回即可。客户甚至不应该注意到这一点。得到就可以了


它就像动态生成的图像,比如缩略图或者其他什么。您会发送两个请求来下载动态生成的图像吗?我不会这样做。

如果请求的房间不存在,只需创建房间并返回即可。客户甚至不应该注意到这一点。得到就可以了


它就像动态生成的图像,比如缩略图或者其他什么。您会发送两个请求来下载动态生成的图像吗?我不会这样做。

如果请求的房间不存在,只需创建房间并返回即可。客户甚至不应该注意到这一点。得到就可以了


它就像动态生成的图像,比如缩略图或者其他什么。您会发送两个请求来下载动态生成的图像吗?我不会这么做。

你指的是GET是一种“安全的方法”。“安全”并不意味着“无法更改服务器状态”。这意味着“客户端无法使用它请求更改服务器状态”。在您的情况下,更改显然是由服务器完成的,用户完全看不见。这与下文引用的最后一段是一致的。如果没有相关的聊天室,我认为您使用GET创建相关聊天室没有问题

第9.1.1节安全方法

实现者应该意识到,软件代表用户 他们通过互联网进行互动,并应小心允许 用户需要知道他们可能采取的任何可能会产生错误的操作 对自己或他人来说意料之外的意义

特别是,该公约已经确立,缔约国 HEAD方法不应具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如POST、PUT和PUT 并以特殊方式删除,以便用户了解 请求可能不安全的操作的事实

当然,不可能确保服务器不运行 执行GET请求时产生副作用;在里面 事实上,一些动态资源认为这是一个特性。重要的 区别在于用户没有要求副作用, 因此,我们不能对他们负责


您指的是GET是一种“安全的方法”。“安全”并不意味着“无法更改服务器状态”。这意味着“客户端无法使用它请求更改服务器状态”。在您的情况下,更改显然是由服务器完成的,用户完全看不见。这与下文引用的最后一段是一致的。如果没有相关的聊天室,我认为您使用GET创建相关聊天室没有问题

第9.1.1节安全方法

实现者应该意识到,软件代表用户 他们通过互联网进行互动,并应小心允许 用户需要知道他们可能采取的任何可能会产生错误的操作 对自己或他人来说意料之外的意义

特别是,该公约已经确立,缔约国 HEAD方法不应具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如POST、PUT和PUT 并以特殊方式删除,以便用户了解 请求可能不安全的操作的事实

当然,不可能确保服务器不运行 执行GET请求时产生副作用;在里面 事实上,一些动态资源认为这是一个特性。重要的 区别在于用户没有要求副作用, 因此,我们不能对他们负责


您指的是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)