【问题标题】:How to save JSON response data automatically when the response hits the URL?响应命中 URL 时如何自动保存 JSON 响应数据?
【发布时间】:2015-05-04 06:39:15
【问题描述】:

我向第三方 URL 发送请求。他们收到我的请求后,会向我的 URL 发送响应。我想在响应到达我的 URL 时自动将该数据保存到我的表中。

响应网址格式:

http://example.com/delivery_reports/new?data=%7B%22requestId%22%3A%22546b384ce51f469a2e8b4567%22%2C%22numbers%22%3A%7B%22911234567890%22%3A%7B%22date%22%3A%222014-11-18+17%3A45%3A59%22%2C%22status%22%3A1%2C%22desc%22%3A%22DELIVERED%22%7D%7D%7D 

我的控制器:

def new        
    json = JSON.parse(params["data"])    
    requestId = json["requestId"]
    numbers = json['numbers']

    numbers.each do |num| 
      @delivery_report = DeliveryReport.new
      @delivery_report.request_id = requestId
      @delivery_report.date = num[1]["date"]
      @delivery_report.receiver = num[0].to_s
      @delivery_report.status = num[1]["status"]
      @delivery_report.description = num[1]["desc"]
      @delivery_report.save
    end     
  end

当我直接在 URL 中输入响应代码时,数据保存到我的表中,但在 URL 被命中时不会自动保存。

日志:

 Started GET "/delivery_reports/new" for 49.207.185.206 at 2015-05-04 09:55:34 +0000
2015-05-04T09:55:34.368716+00:00 app[web.1]: Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
2015-05-04T09:55:34.369910+00:00 app[web.1]:   app/controllers/delivery_reports_controller.rb:17:in `new'
2015-05-04T09:55:34.369913+00:00 app[web.1]: 
2015-05-04T09:55:34.369905+00:00 app[web.1]: 
2015-05-04T09:55:34.367718+00:00 app[web.1]: Processing by DeliveryReportsController#new as HTML
2015-05-04T09:55:34.369912+00:00 app[web.1]: 
2015-05-04T09:55:34.369908+00:00 app[web.1]: TypeError (no implicit conversion of nil into String):
2015-05-04T09:55:34.657079+00:00 heroku[router]: at=info method=GET path="/delivery_reports/new" host=blooming-plains-7422.herokuapp.com request_id=d386f035-9abd-4bce-ae98-696e0038f0cd fwd="49.207.185.206" dyno=web.1 connect=1ms service=19ms status=500 bytes=1754
2015-05-04T09:55:34.655482+00:00 app[web.1]: TypeError (no implicit conversion of nil into String):
2015-05-04T09:55:34.648450+00:00 app[web.1]: Processing by DeliveryReportsController#new as HTML
2015-05-04T09:55:34.655478+00:00 app[web.1]: 
2015-05-04T09:55:34.655486+00:00 app[web.1]: 
2015-05-04T09:55:34.655483+00:00 app[web.1]:   app/controllers/delivery_reports_controller.rb:17:in `new'
2015-05-04T09:55:34.655485+00:00 app[web.1]: 
2015-05-04T09:55:34.645606+00:00 app[web.1]: Started GET "/delivery_reports/new" for 49.207.185.206 at 2015-05-04 09:55:34 +0000
2015-05-04T09:55:34.649265+00:00 app[web.1]: Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
2015-05-04T09:55:36.207273+00:00 heroku[router]: at=info method=GET path="/delivery_reports" host=blooming-plains-7422.herokuapp.com request_id=4f96d14d-b4f4-47dd-af63-44acba98e408 fwd="49.207.185.206" dyno=web.1 connect=1ms service=30ms status=200 bytes=2839
2015-05-04T09:55:36.198316+00:00 app[web.1]:   DeliveryReport Load (10.1ms)  SELECT `delivery_reports`.* FROM `delivery_reports`
2015-05-04T09:55:36.181077+00:00 app[web.1]: Started GET "/delivery_reports" for 49.207.185.206 at 2015-05-04 09:55:36 +0000
2015-05-04T09:55:36.201309+00:00 app[web.1]: Completed 200 OK in 14ms (Views: 3.5ms | ActiveRecord: 10.1ms)
2015-05-04T09:55:36.186741+00:00 app[web.1]: Processing by DeliveryReportsController#index as HTML
2015-05-04T09:55:36.200260+00:00 app[web.1]:   Rendered delivery_reports/index.html.erb within layouts/application (12.3ms)
2015-05-04T09:57:49.734086+00:00 heroku[router]: at=info method=GET path="/delivery_reports" host=blooming-plains-7422.herokuapp.com request_id=967fcaf4-36aa-4c39-ae40-07859d3b9a89 fwd="49.207.185.206" dyno=web.1 connect=2ms service=28ms status=200 bytes=2839
2015-05-04T09:57:49.708444+00:00 app[web.1]: Started GET "/delivery_reports" for 49.207.185.206 at 2015-05-04 09:57:49 +0000
2015-05-04T09:57:49.724911+00:00 app[web.1]: Completed 200 OK in 4ms (Views: 3.0ms | ActiveRecord: 0.5ms)
2015-05-04T09:57:49.722539+00:00 app[web.1]:   DeliveryReport Load (0.5ms)  SELECT `delivery_reports`.* FROM `delivery_reports`
2015-05-04T09:57:49.720397+00:00 app[web.1]: Processing by DeliveryReportsController#index as HTML
2015-05-04T09:57:49.724189+00:00 app[web.1]:   Rendered delivery_reports/index.html.erb within layouts/application (2.5ms)
2015-05-04T09:57:49.991163+00:00 heroku[router]: at=info method=GET path="/assets/application-0723cb9a2dd5a514d954f70e0fe0b89f6f9f1ae3a375c182f43b5f2b57e9c869.css" host=blooming-plains-7422.herokuapp.com request_id=129f86b0-b6e2-4637-9f5c-cc4bc3df856c fwd="49.207.185.206" dyno=web.1 connect=1ms service=8ms status=304 bytes=133
2015-05-04T09:57:50.218280+00:00 heroku[router]: at=info method=GET path="/assets/application-dfda1387e2621704c9c53ddd9c1573c1f5099fd3108a2a96d2b02d9b79203f15.js" host=blooming-plains-7422.herokuapp.com request_id=38108dcf-fe1f-416e-a013-5692c84a1794 fwd="49.207.185.206" dyno=web.1 connect=1ms service=5ms status=304 bytes=133
2015-05-04T09:57:52.456405+00:00 heroku[router]: at=info method=GET path="/delivery_reports" host=blooming-plains-7422.herokuapp.com request_id=c04fa439-d812-4214-91d6-8d4ca34be7d0 fwd="49.207.185.206" dyno=web.1 connect=3ms service=22ms status=200 bytes=2839
2015-05-04T09:57:52.437697+00:00 app[web.1]: Started GET "/delivery_reports" for 49.207.185.206 at 2015-05-04 09:57:52 +0000
2015-05-04T09:57:52.446959+00:00 app[web.1]:   DeliveryReport Load (1.5ms)  SELECT `delivery_reports`.* FROM `delivery_reports`
2015-05-04T09:57:52.449426+00:00 app[web.1]: Completed 200 OK in 5ms (Views: 3.2ms | ActiveRecord: 1.5ms)
2015-05-04T09:57:52.443892+00:00 app[web.1]: Processing by DeliveryReportsController#index as HTML
2015-05-04T09:57:52.448588+00:00 app[web.1]:   Rendered delivery_reports/index.html.erb within layouts/application (3.5ms)
2015-05-04T09:57:52.719122+00:00 heroku[router]: at=info method=GET path="/assets/application-0723cb9a2dd5a514d954f70e0fe0b89f6f9f1ae3a375c182f43b5f2b57e9c869.css" host=blooming-plains-7422.herokuapp.com request_id=8efc9c84-b49a-4564-b2d9-b03fabbce459 fwd="49.207.185.206" dyno=web.1 connect=5ms service=9ms status=304 bytes=133
2015-05-04T09:57:52.721796+00:00 heroku[router]: at=info method=GET path="/assets/application-dfda1387e2621704c9c53ddd9c1573c1f5099fd3108a2a96d2b02d9b79203f15.js" host=blooming-plains-7422.herokuapp.com request_id=6de87b4d-12ff-448a-9d2f-38ba6e20a15d fwd="49.207.185.206" dyno=web.1 connect=1ms service=11ms status=304 bytes=133

【问题讨论】:

  • 您的模型中是否有任何验证?试试save! - @delivery_report.save!。看看有没有报错。
  • 响应是通过 GET 还是 POST 发送的?

标签: ruby-on-rails json api ruby-on-rails-4 response


【解决方案1】:

如果它在您通过浏览器访问链接时有效,但在点击 url 时无效,则很可能是因为 API 使用了 POST 请求。

将路由添加到您的routes.rb

post 'delivery_reports/new', to: 'delivery_reports#new'

【讨论】:

  • 您在日志中看到 API 请求了吗?您可以将其复制粘贴到您的问题中吗?
  • 您可能会在日志中找到它,其中包含tail -n10000 | grep delivery_reports -A5 -B3
  • 问题不在于这里的路线。日志指定其问题已在新操作中。
  • 是的,鉴于信息有限,路由只是最可能的猜测,Raj kumar 之后添加了日志
【解决方案2】:

看看下面的代码sn-ps。这应该是格式。格式化的 Json 应该根据 rails 的常规参数名称进行格式化。你可以试试。

if params[:data].present?    
  request = params[:data][:request_id]
  numbers = params[:data][:number]
  #....

可能的调试方式:

  1. 或者您可以尝试使用 pry gem 并将binding.pry 放入您的操作块中,然后您可以检查正确的参数。并检查您的记录保存过程。
  2. 您可以使用基于浏览器的 gem 来模拟具有相同数据的 api 命中,以在本地计算机上生成此问题,从而实现您期望从完全相同的 api 命中获得的所需行为。
  3. 您也可以添加 raise params.inspect 来调试您的参数。但这可能无法为您提供完整的信息,为什么您的代码可能会中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2020-06-11
    • 1970-01-01
    • 2019-06-04
    • 2013-09-29
    相关资源
    最近更新 更多