【问题标题】:How to Receive Push Notifications from AWS S3 to Rails App?如何接收从 AWS S3 到 Rails 应用程序的推送通知?
【发布时间】:2016-05-06 10:07:51
【问题描述】:

免责声明,我是 Rails 新手。所以我可能完全做错了。

我需要在将最新图像上传到 AWS S3 存储桶(来自其他来源)后立即在 Rails 应用程序的视图中显示该图像。与其反复更新/轮询最新图像,我认为在上传新图像时从 AWS 获得通知会更省力且成本更低。

我查看了 SNS,似乎可以选择使用 rails url 作为端点的 HTTP 通知。但我不确定如何设置。

有什么想法或建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby amazon-web-services amazon-s3


    【解决方案1】:
    1. 创建一个可以接受 SNS 通知的 Rails 端点。
    2. Enable S3 event notifications to SNS
    3. Configure the SNS topic 正在接收 S3 事件以推送到 Rails 应用程序的端点。

    【讨论】:

    • 感谢@Mark B。我能够为我的终端节点订阅 Amazon SNS 主题。我现在坚持的部分是使用 Rails 处理来自 SNS 的 HTTP Post 请求。一般不知道如何使用 Rails 处理 SNS 消息或发布请求。
    • @Matte3o 消息将采用 JSON 格式,请使用您熟悉的任何 Ruby/Rails JSON 解析器。
    【解决方案2】:

    想出了一个可行的方法,不确定它是否是最佳的,或者这是否符合适当的 Rails 标准,但它有效并且实施起来相对简单。因此,我想为任何想要这样做的人详细说明该过程,即为 Rails 应用程序订阅 Amazon SNS 推送通知。

    首先,您需要设置此配置的 AWS 端,因此请按照此问题的第一个答案 Mark B 的说明进行操作。您会发现 AWS 文档指示您在设置 SNS 订阅之前让您的应用程序准备好处理 HTTP Post 请求。也就是说,您可以在设置的 Rails 端执行以下操作来配置所有内容

    为了接收 HTTP post 请求,您需要设置一个简单的 API。您可以通过创建控制器和自定义路由来处理来自外部来源的 get/post 请求。由于亚马逊只发送发布请求,因此您只需要一个控制器操作和一个路由。从一个新的控制器开始并将控制器文件存储在 apps/controllers/api/v1/,格式为:

    class Api::V1::ControllerNameController < ApplicationController
      def create
    
      end 
    end
    

    然后设置你的路线config/routes.rb:

     namespace :api, defaults: {format: :json}  do
        namespace :v1 do
          post "/controller_name" => 'controller_name#create'
        end
      end
    

    您会注意到控制器文件位置和命名空间调用以创建格式为/api/v1/ 的 URL,这样做是为了良好的做法,this article 在第 4.1.3 节中有很好的解释原因

    然后,您将在 AWS 中将订阅通知的端点设置为 https://your-site-url/api/v1/controller_name,这与发布请求的 URL 匹配。

    接下来,您已准备好接收来自 AWS 的 Post 请求。我发现的重要一点是传入的帖子请求可以通过变量request 访问。为了将其转换为可读的 JSON 格式,您可以调用以下代码:

    request.body.read()
    

    您可以将其放入新控制器的创建操作中。您可以使用以下内容将其打印到控制台:

    @request = request.body.read()
    puts "this is the content of the request: #{@request}"
    

    从控制台的输出中,您可以获取此 JSON 对象中的“SubscribeURL”,将其复制并粘贴到网络浏览器中以确认您的订阅。并且繁荣,这是成功的一半!

    此外,这个新变量可用于存储您的 JSON 对象,并从 AWS 访问所有相关信息并执行您需要执行的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2017-04-27
      相关资源
      最近更新 更多