在Sinatra(Ruby)中结合GET和POST

时间:2011-09-10 12:06:42

标签: ruby rest post heroku sinatra

我正在尝试创建一个RESTful api,并且有一些需要凭据的功能。例如,假设我正在编写一个函数,可以查找某个半径范围内的所有附近位置,但只有授权用户才能使用它。

一种方法是使用GET发送所有内容,如下所示: http://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30&username=john&password=blabla123

但显然这是最糟糕的方式。

是否可以改为移动用户名和密码字段并将它们作为POST变量嵌入SSL,因此URL只会如下所示: https://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30

并且凭据将以加密方式发送。

那么我如何在Sinatra和Ruby中正确地获取GET和POST变量?这是正确的方法吗?如果不是为什么不呢?

3 个答案:

答案 0 :(得分:2)

如果您真的想要创建一个宁静的API,而不是某些URL端点恰好说一些HTTP方言,那么您应该坚持使用GET。它甚至在你的道路上再次出现,所以你似乎很确定这是一个得分。

不应试图隐藏GETPOST参数中的用户名和密码,而应使用Basic authentication,这是专为此目的而发明的,并且在客户端普遍可用(并且可以使用Sinatra中的便利方法获得。

此外,如果您尝试使用REST,您应该接受资源和resoiurce集合的概念(这是REST的R和E所暗示的)。所以你有一个像http://myapi.heroku.com/NearbyPlaces这样的网址。如果您GET在那里,则会收集有关该资源的信息,如果您POST,则创建新资源,PUT yopu更新现有资源以及DELETE好吧,你删除它。您之前应该做的是将对象空间构建到这些资源中并围绕它设计API。

可能您可以在http://myapi.heroku.com/places处拥有资源集合。作为资源的每个地点都有一个唯一的网址,例如http://myapi.heroku.com/places/123。可以通过POST http://myapi.heroku.com/places创建新的极化。 GET http://myapi.heroku.com/places/nearby?lon=12.343523&lat=56.123533&radius=30可以收集附近的地方。帽子调用可以将一个或多个URL返回到附近的地方,例如

[
    "http://myapi.heroku.com/places/123",
    "http://myapi.heroku.com/places/17",
    "http://myapi.heroku.com/places/42"
]

如果你想真正被发现,你也可以拥抱HATEOAS,它限制REST smentics,允许API客户端像浏览器用户那样“浏览”API。为了实现这一点,您可以在API中使用指向其他资源的超链接,类似于上面的示例。

答案 1 :(得分:1)

作为网址一部分的参数(即lonlatradius)称为查询参数,您希望在表单中发送的用户和密码信息被称为表单参数。在Sinatra中,这两种类型的参数都可以在控制器的params哈希中使用。

因此,在Sinatra中,您可以将lon参数视为params[:lon],将user参数视为params[:user]

答案 2 :(得分:1)

我建议使用基本或摘要式身份验证和普通的GET请求。换句话说,您的请求应为“GET / places?lat = x& lon = x& radius = x”,您应该让HTTP处理身份验证。如果我理解你的情况,这是理想的方法,肯定是最RESTful的解决方案。

另外,您的URI可以改进。在资源名称中使用动词(“get”)和类似查询的形容词(“near”)并不合适。一般来说,资源应该是名词(即“地方”,“人”,“书”)。请参阅我上面写的示例请求; “get”是多余的,因为您正在使用GET请求并且“附近”是多余的,因为您已经按位置进行查询。