2014-03-12 3 views
2

내 앱은 HelloSign API에서 이벤트 데이터가 포함 된 제 3 자 POST 콜백을받습니다.레일즈가 JSON으로 POST 요청을 처리합니다.

문제는 json을 "내부"에서 파싱하고 데이터를 저장하지 못하는 것입니다. [: JSON] : PARAMS로부터받은

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 

이벤트 데이터는

{ 
"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]cc\",\"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 데이터를 분석하고 당신이 더 모든 변수를 POST 에드을 얻기 위해 읽을 수있는, 그것을 위해 hash를 반환합니다.

예를 들어 account_id를 얻으려면 json_data["client_id"]을 사용하여 signature_id을 얻고 json_data["signature_request"]["signatrues"][0]["signature_id"] 등을 사용합니다.

관련 문제