2015-05-04 41 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來調試你的參數。但是這可能無法給你提供完整的信息,說明你的代碼可能會破壞