ajax-запрос opal-jquery отправляет искаженную строку json

Я использую opal-jquery для отправки ajax-запроса на мой бэкэнд, но полезная нагрузка json искажается, когда я пытаюсь получить доступ к нему на бэкенде.

Когда я делаю puts @params.to_s на моем бэкэнде это выглядит так:

{"{\"username\":\"some_user\", \"password\":\"some_password\"}"=>nil}

Таким образом, чтобы получить данные для входа, я должен сделать:

@params.each do |k,v|
    login_details = JSON.parse(k)
end

Мой запрос на отправку (опал) выглядит так:

    def handle_login_submit details
    url = "/client/api/auth"
    HTTP.post url, payload: details.to_json, dataType: 'json' do |response|
        case response.status_code / 100
        when 2
            puts response.status_code
            self.login_state = :return_success 
            puts response.json
        when 4
            self.login_state = :return_failed
            puts response.status_code
            puts response.json
        when 5
            self.f_message = {type: :error, message: "There was a server error" }
            self.login_state = :return_failed
        end

    end

end

Я точно знаю, что детали правильно отформатированы, так что это не проблема.

Я думаю, в конце концов, все сводится к тому,

  1. opal-jquery отправляет почтовый запрос неправильно

  2. Синатра неправильно обрабатывает запрос.

Я не уверен, какой это, но я склонен полагать, что это первый, потому что он работал нормально, прежде чем я переключился на использование activ.rb для внешнего интерфейса.

1 ответ

Решение

После следования совету, в частности, я делаю:

before do
  request.body.rewind
  req = request.body.read
  puts req
  puts JSON.parse(req)
end

Мне удалось увидеть, что запрос поступил на сервер правильно и как ожидалось. Я не знаю почему, но Синатра искажал ответ в такой степени, что @params вышел как

{"{\"username\":\"some_user\", \"password\":\"some_password\"}"=>nil}

так что, в конце концов, я делаю

before do
    request.body.rewind
    @request_payload = JSON.parse(request.body.read)
    request.body.rewind
end

Чтобы прочитать тело запроса до того, как Синатра что-нибудь получит, и просто зачитать нужные мне параметры @request_payload,

Другие вопросы по тегам