2014-03-12 203 views
2

我的應用程序從HelloSign API接收到第三方POST回調和事件數據。Rails使用JSON處理POST請求

問題是,我似乎無法得到「內部」的JSON解析並保存數據。 [:JSON]:

class HelloSignController < ApplicationController 
    def receives_data 
    j = params[:json] 
    logger.info('THIS IS JSON: ' + j) 
    respond_to do |format| 
     format.json { render json: "Hello API Event Received", 
          status: :ok } 
    end 
    end 
end 

從PARAMS接收到的事件數據

{ 
"event": { 
    "event_type": "signature_request_sent", 
    "event_time": "1394642012", 
    "event_hash": "xxxxx" 
}, 
"account_guid": null, 
"client_id": "xxxx", 
"signature_request": { 
    "signature_request_id": "xxxxxxx", 
    "title": "Review Agreement", 
    "original_title": "Review Agreement", 
    "message": null, 
    "test_mode": true, 
    "is_complete": false, 
    "final_copy_uri": "/v3/signature_request/final_copy/xxxxx", 
    "files_url": "https://api.hellosign.com/apiapp.php/v3/signature_request/files/xxxxx", 
    "details_url": "https://www.hellosign.com/home/manage?locate=xxxxx", 
    "requester_email_address": "xxxxxxx", 
    "signatures": [ 
     { 
      "signature_id": "xxxxx", 
      "has_pin": false, 
      "signer_email_address": "[email protected]", 
      "signer_name": "admin", 
      "order": null, 
      "status_code": "awaiting_signature", 
      "signed_at": null, 
      "last_viewed_at": null, 
      "last_reminded_at": null 
     } 
    ] 
} 
} 

我如何解析 「J」 保存 「EVENT_TYPE」 和 「signature_request_id」 的例子?

感謝

另外:這是從控制檯的實際回調:

Started POST "/hs_callback" for 127.0.0.1 at 2014-03-12 13:32:38 -0400 
Processing by HelloSignController#receives_data as */* 
Parameters: {"json"=>"{\"event\":{\"event_type\":\"signature_request_sent\",\"event_time\":\"1394645254\",\"event_hash\":\"xxxxx\",\"event_metadata\":{\"related_signature_id\":\"\",\"reported_for_account_id\":null,\"reported_for_app_id\":\"xxxxx\",\"event_message\":null}},\"account_guid\":null,\"client_id\":\"xxxxx\",\"signature_request\":{\"signature_request_id\":\"xxxx\",\"title\":\"Review Agreement\",\"original_title\":\"Review Agreement\",\"subject\":null,\"message\":null,\"test_mode\":true,\"is_complete\":false,\"has_error\":false,\"custom_fields\":[],\"response_data\":[],\"signing_url\":null,\"signing_redirect_url\":null,\"final_copy_uri\":\"\\/v3\\/signature_request\\/final_copy\\/xxxxxx\",\"files_url\":\"https:\\/\\/api.hellosign.com\\/apiapp.php\\/v3\\/signature_request\\/files\\/xxxxxxx\",\"details_url\":\"https:\\/\\/www.hellosign.com\\/home\\/manage?locate=xxxxxx\",\"requester_email_address\":\"[email protected]\",\"signatures\":[{\"signature_id\":\"xxxxx\",\"has_pin\":false,\"signer_email_address\":\"[email protected]\",\"signer_name\":\"xxxxxxx\",\"order\":null,\"status_code\":\"awaiting_signature\",\"signed_at\":null,\"last_viewed_at\":null,\"last_reminded_at\":null}],\"cc_email_addresses\":[]}}"} 

回答

4
j = JSON.parse(params[:json]) 
j['event']['event_type'] # => "signature_request_sent" 
j['signature_request']['signature_request_id'] # => "xxxxxxx" 
+0

JSON.parse是魔術!謝謝 – jakeed1

2

使用JSON.parse

require 'json' 

#in your code 
json_data = JSON.parse(params[:json]) 

這將解析JSON數據並返回一個hash它,你可以進一步閱讀來獲取所有變量POST版。

例如,要獲取account_id,請使用json_data["client_id"],獲取signature_id,使用json_data["signature_request"]["signatrues"][0]["signature_id"],依此類推。