在Sinatra(Ruby)中结合GET和POST

在Sinatra(Ruby)中结合GET和POST,ruby,rest,post,heroku,sinatra,Ruby,Rest,Post,Heroku,Sinatra,我正在尝试制作一个RESTful api,并且有一些需要凭据的函数。例如,假设我正在编写一个函数,它可以查找某个半径内的所有附近位置,但只有授权用户才能使用它 一种方法是使用GET like so发送所有内容: http://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30&username=john&password=blabla123 但显然这是最糟糕的方法 是否可以移动用户名和密码字段,并通过SSL

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

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

但显然这是最糟糕的方法

是否可以移动用户名和密码字段,并通过SSL将其作为POST变量嵌入,这样URL看起来只会像这样:
https://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30

并且凭证将被加密发送


那么,在Sinatra和Ruby中,如何正确地获取get和POST变量呢?这样做对吗?如果不是,为什么不呢?

作为url一部分的参数(即
lon
lat
radius
)称为查询参数,要在表单中发送的用户和密码信息称为表单参数。在Sinatra中,控制器的
params
散列中提供了这两种类型的参数


因此,在Sinatra中,您可以将
lon
参数作为
params[:lon]
访问,而
user
参数作为
params[:user]
作为url一部分的参数(即
lon
lat
radius
)称为查询参数,要在表单中发送的用户和密码信息称为表单参数。在Sinatra中,控制器的
params
散列中提供了这两种类型的参数


因此,在Sinatra中,您可以访问
lon
参数作为
params[:lon]
,以及
user
参数作为
params[:user]
,我建议使用基本或摘要身份验证和简单的GET请求。换句话说,您的请求应该是“GET/places?lat=x&lon=x&radius=x”,您应该让HTTP处理身份验证。如果我正确理解您的情况,这是一种理想的方法,肯定是最安全的解决方案


顺便说一句,您的URI可以改进。在资源名称中使用动词(“get”)和类似查询的形容词(“nearly”)并不是很合适。一般来说,资源应该是名词(即“地点”、“人”、“书”)。参见我上面写的示例请求;“get”是多余的,因为您使用的是get请求,“Near”是多余的,因为您已经在按位置进行查询。

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


顺便说一句,您的URI可以改进。在资源名称中使用动词(“get”)和类似查询的形容词(“nearly”)并不是很合适。一般来说,资源应该是名词(即“地点”、“人”、“书”)。参见我上面写的示例请求;“get”是多余的,因为您正在使用get请求,“Nearear”是多余的,因为您已经在按位置进行查询。

如果您真的试图创建restful API,而如果某些URL端点碰巧使用某种HTTP方言,您应该坚持使用get。它甚至再次出现在你的道路上,所以你似乎很确定这是一个机会

您不应该试图在
GET
POST
参数中隐藏用户名和密码,而应该使用,这是专门为该目的而发明的,在客户端中普遍可用(并且可以使用Sinatra中的便利方法)

此外,如果您试图使用REST,您应该接受资源和资源集合的概念(REST的R和E暗示了这一点)。所以你有一个像
http://myapi.heroku.com/NearbyPlaces
。如果您
在那里获取
,您将收集有关该资源的信息,如果您
发布
,您将创建一个新资源,如果您
yopu更新现有资源,如果您
删除
,那么您将删除它。在此之前,您应该做的是将对象空间构造成这些资源,并围绕这些资源设计API

可能,您可以在
http://myapi.heroku.com/places
。作为资源的每个位置都有一个唯一的URL,如
http://myapi.heroku.com/places/123
。新极性可以通过
POST
ing to创建。附近的地方可以通过
GET
ing
http://myapi.heroku.com/places/nearby?lon=12.343523&lat=56.123533&radius=30
。hat调用可以将数组或URL返回到附近的位置,例如

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

如果您想真正被发现,您还可以接受REST smentics中的哪些约束,以允许API客户端像使用浏览器的用户那样通过API“浏览”。要做到这一点,您可以在API中使用指向其他资源的超链接,就像上面的示例一样。

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

您不应该试图在
GET
POST
参数中隐藏用户名和密码,而应该使用,这是专门为该目的而发明的,在客户端中普遍可用(并且可以使用Sinatra中的便利方法)

此外,如果您试图使用REST,您应该接受资源和资源集合的概念(REST的R和E暗示了这一点)。所以你有一个像
http://myapi.h