从另一台设备向后端API发送POST请求/响应?

时间:2018-02-15 19:11:48

标签: ruby-on-rails http raspberry-pi

所以我有这个计划使用一些覆盆子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请求的理解。

1 个答案:

答案 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
}