2015-05-04 144 views
0

我向第三方URL发送请求。他们收到我的请求后,会向我的网址发送回复。当响应到达我的URL时,我想自动将这些数据保存到我的表格中。如何在响应命中URL时自动保存JSON响应数据?

响应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 
+0

您的模型中有任何验证吗?尝试'保存!' - '@ delivery_report.save!'。看看它是否会抛出任何错误。 –

+0

通过GET或POST发送响应吗? – makhan

回答

0

如果当你通过浏览器访问该链接,但不是因为API使用POST请求时,URL被击中它最有可能的工作。

添加路由到您的routes.rb

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

我加入了路线。但是数据没有保存到db .. –

+0

你在日志中看到API请求吗?你可以复制粘贴到你的问题? – makhan

+0

你可以在你的日志中找到一些符合'tail -n10000 | grep delivery_reports -A5 -B3' – makhan

0

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

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

可能的方式来调试:

  1. 或者你可以尝试使用撬宝石,把binding.pry在动作块,然后你可以检查为右PARAMS。并检查您的记录保存过程。
  2. 您可以使用基于浏览器的gem来模拟相同数据的api命中,以在您的本地计算机上生成此问题,以实现期望的行为,您期望从完全相同的api命中。
  3. 你可以添加一个raise params.inspect来调试你的参数。但是这可能无法给你提供完整的信息,说明你的代码可能会破坏