Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从其他设备向后端API发送POST请求/响应?_Ruby On Rails_Http_Raspberry Pi - Fatal编程技术网

Ruby on rails 从其他设备向后端API发送POST请求/响应?

Ruby on rails 从其他设备向后端API发送POST请求/响应?,ruby-on-rails,http,raspberry-pi,Ruby On Rails,Http,Raspberry Pi,所以我计划使用一些raspberry PI Zero将数据发送到我将要设计的Rails后端API。这是为了获得更多关于Rails的经验,只是为了一个有趣的项目 我将读取Raspberry Pi上的传感器数据,并将其发送到我的REST API。数据将被存储,然后我可以进入仪表板上的每个传感器页面,查看温度的历史值/时间线或我决定使用的任何传感器 我对HTTP请求非常熟悉……但通常只在同一台服务器上。这让我意识到我并不真正理解它们是如何工作的。我只知道,对于表单,我需要使用POST/GET来处理普通

所以我计划使用一些raspberry PI Zero将数据发送到我将要设计的Rails后端API。这是为了获得更多关于Rails的经验,只是为了一个有趣的项目

我将读取Raspberry Pi上的传感器数据,并将其发送到我的REST API。数据将被存储,然后我可以进入仪表板上的每个传感器页面,查看温度的历史值/时间线或我决定使用的任何传感器

我对HTTP请求非常熟悉……但通常只在同一台服务器上。这让我意识到我并不真正理解它们是如何工作的。我只知道,对于表单,我需要使用POST/GET来处理普通页面/等等,以及涉及到的一般路由

也就是说,我知道在Rails方面,我可能需要通过POST请求接收数据,就像提交表单一样……但我不确定应该如何发送它?以什么形式?它应该如何建造

我认为这很简单,但我越想越觉得自己不知道。我知道我需要通过运行python脚本的CRON作业每隔x个时间间隔发送一次数据,这样我就可以向API发送POST请求了,对吗?我想我明白,在发送POST请求时,网站上的表单是很有用的,但我们到底在请求什么呢?表单POST请求将返回什么?只要200美元,好吗

对于这些设备,如何处理:发送POST请求以发送传感器数据以保存在后端,服务器是否应响应它们


谢谢,很抱歉问了这么多分散的问题。我意识到我所知道的比我开始学习rails时少得多。只是想澄清我对http请求的理解。

将数据作为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创建的响应或422坏实体。发送位置头实际上是可选的,因为PI可能不会对响应执行任何操作

有效负载的具体格式取决于作者。此示例仅使用平面JSON对象:

{
  temperature: 3,
  foo: 2,
  bar: 3
}

您熟悉curl命令吗?如果您对编辑crontab感到满意,那么可以添加一个curl命令来执行httppost。您还需要禁用Rails的真实性令牌检查。不过,我对它有点熟悉,这是一个很好的提示。我只是假设我会使用python,但是的,curl可能更容易。我可能会使用python来验证我从服务器或其他地方得到的响应。啊,是的,交互最好用脚本来完成。Python和Ruby都广泛支持HTTP。post在两种语言中通常只有一行,例如:Net::HTTP.post\u formURI.parseurl,Ruby中的参数。如果你还没有将rails应用程序设置为仅API的应用程序,你需要跳过rails CRSF保护。如果只是一个爱好项目,并且任何潜在的篡改都无关紧要,你也可以完全跳过身份验证。我只是对编程有点耳目一新,只知道一些rails的基本知识——你典型的CRUD知识马上然而,这是非常有用的。所以我有几个问题:1。我不知道地点是什么?介意解释一下吗?或者“头”是什么意思?2.我猜观察结果可能只是我定义的某个模式或什么?或者是一个具有所有历史价值的模型?3.我仍然有点纠结于如何做ID,有人提到在我的Python脚本中使用UUID和标记,所以当发送POST请求时,它会发送UUID吗?有什么想法吗?pi是否会自动收到服务器的响应?或者我需要听听吗?不过,我确实喜欢发送JSON的想法。还有旁注:如果我想做令牌身份验证,我会怎么做?如果我想做令牌身份验证,我会怎么做这是一本书或长篇博客的主题。你必须做你的研究。