2017-09-09 85 views
7

Używając https://requestb.in, widzę, że webhook poprawnie wysyła dane nagłówka + JSON. Ale kiedy wysyłam żądanie json do mojego serwera, pojawia się błąd podczas analizowania jsona.Parsowanie JSON z żądania webhook

moim kontrolera (nie może odbierać dane ciała): wyjście

class ReceiverController < ApplicationController 
    skip_before_filter :verify_authenticity_token 

    def handle_post 
     puts request.headers['Content-Type'] 
     puts "request:" 
     puts JSON.parse(request.raw_post) 
     puts "request2:" 
     puts JSON.parse(request.body.read) 
    end 
end 

Error:

application/json; charset=utf-8 
request: 
JSON::ParserError (A JSON text must at least contain two octets!): 
app/controllers/receiver_controller.rb:69:in `handle_post' 
request2: 
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.0ms) 

routes.rb

post "/receive" => 'receiver#handle_post' 
+0

że ouptput od 'stawia request.body.read'? –

+0

@ Зелёный Przepraszam, że był wynik polecenia 'JSON.parse (request.raw_post)'. Dodałem wynik polecenia 'JSON.parse (request.body.read)' – Taylor

+0

Czy przeczytałeś mój komentarz? Pokaż wynik polecenia 'puts request.body.read'. –

Odpowiedz

0

myślę szyny bloki otrzymanie prośby becaus e od CSRF-ochrona że szyny zapewnia, jestem początkującym z użyciem paskiem webhooks ale ich dokumentacja webhooks poradził mi, aby wykonać następujące czynności (https://stripe.com/docs/webhooks):

Jeśli używasz szyny, Django lub inny framework sieciowy, Twoja witryna może automatycznie sprawdzić, czy każde żądanie POST zawiera token CSRF. Jest to ważna funkcja bezpieczeństwa, która pomaga chronić Ciebie i Twoich użytkowników przed próbami fałszowania żądań między witrynami. Jednak ten środek bezpieczeństwa może również uniemożliwić Twojej witrynie przetwarzanie legalnych haseł internetowych. Jeśli tak, być może trzeba zwolnić trasę webhooks z ochrony CSRF.

class ReceiverController < ApplicationController 
# If your controller accepts requests other than webhooks, 
# you'll probably want to use `protect_from_forgery` to add CSRF 
# protection for your application. But don't forget to exempt 
# your webhook route! 
protect_from_forgery :except => :handle_post 

def handle_post 
    # Process webhook data in `params` 
end 
end 
+0

Mam ten sam problem co OP i mam tę linię protect_from_forgery w moim kontrolerze, więc myślę, że rozwiązania należy znaleźć gdzieś indziej. – luissimo

+1

@luissimo Jak wspomniałeś, nie rozwiązało to problemu.Używam zarówno 'protect_from_forgery: except =>: handle_post' i' skip_before_action: verify_authenticity_token,: only => [: handle_post] ' – Taylor