所以我有这个计划使用一些覆盆子PI Zero将数据发送到我正在设计的Rails后端API。这是为了获得更多Rails的经验,只是为了一个有趣的副项目。
我将在Raspberry Pi上读取传感器数据并将其发送到我的REST API(数据将被存储,然后我可以转到仪表板上的每个“传感器”页面并查看温度的历史值/时间线或无论我决定使用什么传感器。)
我最熟悉HTTP请求...但通常只在同一台服务器上。这让我意识到我并不真正理解他们的“如何”工作。 (我只知道使用Forms我需要使用POST / GET进行常规页面/等等....而且只涉及一般的路由)。
话虽这么说,我知道在Rails方面我需要通过POST请求(类似于提交的表单的类似)接收数据...但我不确定我应该如何发送它?以什么格式?应该如何构建?
我觉得这很简单,但是我越想到它就越觉得我不知道。我知道我需要每x个间隔发送一次数据(通过运行python脚本的CRON作业)所以我要向API发送POST请求吗?我想我理解一个网站上的表格发送POST请求但我们究竟要求什么?从Form POST请求返回什么?只有200个状态好吗?
在这些设备的情况下:发送POST请求以发送传感器数据以保存在后端,服务器是否应该回复它们?
谢谢,对不起这个分散的问题。我意识到我比开始学习rails时知道的要少得多。只是试图澄清我对http请求的理解。
答案 0 :(得分:1)
以JSON格式发送数据。构建rails应用程序与构建任何其他JSON API并没有什么不同。
让我们假设您将模型设置为:
# app/models/measurement.rb
class Measurement
belongs_to :unit
end
# app/units/unit.rb
class Unit
has_many :measurements
end
您可以使用基于令牌的身份验证方案对每个PI单元进行身份验证。或者您可以使用共享密钥,例如设备的MAC地址。
您可以通过rails控制台在rails应用程序中注册每个PI单元,或者如果您想彻底,可以在rails应用程序中为它创建路径和控制器。
如果您不想手动输入每个PI单元的rails db id,您可以创建一个“发现路由”,PI发送其MAC地址并获取ID。
要注册测量,您只需发送POST请求:
# /config/routes.rb
resources :units do
resources :measurements, module: :units, only: [:create, :index]
end
# /app/controllers/units/measurements_controller.rb
module Units
class MeasurementsController
before_action :set_unit
before_action :authenticate_unit!
# POST /units/:unit_id/measurements
def create
@measurement = @unit.measurements.new(measurement_params)
if @measurement.save
head :created, location: @measurement
else
head :unprocessable_entity
end
end
# GET /units/:unit_id/measurements
def index
render json: @unit.measurements
end
private
def authenticate_unit!
# @todo check auth token in header.
# should raise an exception and return 401 unauthorized if not authenticated
end
def set_unit
@unit = Unit.find(params[:id])
end
def measurement_params
params.permit(:temperature, :foo, :bar)
end
end
end
Pi会将数据发送到POST /units/:unit_id/measurements
并获得201 - Created
响应或422 - Bad entity
。发送Location
标头实际上是可选的,因为PI很可能不会对响应做任何事情。
有效负载的确切格式取决于作者。此示例仅使用“平面”JSON对象:
{
temperature: 3,
foo: 2,
bar: 3
}