Json API Curl для запроса HTTParty. Запрос работает на моем локальном компьютере с cURL, но не на производстве Heroku с HTTParty.

Итак, я дошел до того, что не знаю, какой вопрос задать, исследуя мою проблему. Итак, приходя сюда, я прошу 2 вещи.

Во-первых, как я могу расследовать подобные проблемы в будущем? Во-вторых, что я сейчас делаю не так?

По сути, я создал приложение и отправил его на Heroku. Это приложение имеет конечные точки API, которые работают именно так, как я ожидаю, когда я запускаю приложение локально и отправляю команды curl через свой терминал. Код, который я запускаю, чтобы попытаться войти в свое приложение, использует гем HTTP и возвращает {"status":500,"error":"Internal Server Error"}.

Итак, я впервые пытаюсь подключиться к какой-либо конечной точке API, поэтому здесь я немного блуждаю в темноте. Что я читал об ошибке 500, так это: «Когда ничего не помогает; обычно ответ 500 используется, когда обработка завершается сбоем из-за непредвиденных обстоятельств на стороне сервера, что приводит к ошибке сервера». Это звучит немного похоже на все, что сломалось, но мы не знаем, что, кроме того, что это на бэкэнде. Пожалуйста, поправьте меня, если я ошибаюсь.

Что мне делать дальше?

Это команда curl, которую я запускаю, чтобы отправить электронное письмо и пароль для получения и auth_token:

curl -d "user_login[email][email protected]&user_login[password]=password123" http://localhost:3000/api/v1/sign-in

Как и ожидалось, я получаю это обратно:

{"auth_token":"628f3ebc47193665e7f1d32ae41ff9a7"}% 

Это код, который я запускаю с помощью HTTParty, чтобы попытаться подключиться к моему API в производстве с помощью Heroku:

потреблять_api.rb

require "rubygems"
require "httparty"

query_hash = { :user_login => "[email protected]",
               :password => "password123" }

response = HTTParty.post("https://fake-heroku-94488.herokuapp.com/api/v1/sign-in", :query => query_hash)

puts response.body, response.code, response.message, response.headers.inspect

Это ответ:

{"status":500,"error":"Internal Server Error"}
500
Internal Server Error
{"server"=>["Cowboy"], "date"=>["Fri, 03 Feb 2017 14:49:40 GMT"], "connection"=>["close"], "content-type"=>["application/vnd.api+json; charset=utf-8"], "x-request-id"=>["5d094cee-11a2-4040-abfd-5180f5e46886"], "x-runtime"=>["0.003503"], "vary"=>["Origin"], "content-length"=>["46"], "via"=>["1.1 vegur"]}

Повторю мои вопросы: что я могу взять из этого ответа, чтобы начать дальнейшее расследование? Какие вопросы я должен задавать себе, когда это происходит?

Во-вторых, что я сделал не так?

Заранее спасибо за вашу помощь.

Редактировать:

Быстрое обновление заключается в том, что я запустил команду curl, которая работала локально с фактическим URL-адресом моего рабочего сайта, и она работала точно так же, как и локально. Я все еще не могу продвинуться дальше, используя HTTParty.

Я проверил свой heroku logs и нашел это:

2017-02-03T17:22:26.576272+00:00 heroku[router]: at=info method=POST path="/api/v1/sign-in" host=fake-heroku-94488.herokuapp.com request_id=9ab76ce0-95f3-4479-8672-874a624c070e fwd="108.11.195.58" dyno=web.1 connect=1ms service=8ms status=500 bytes=265
Started POST "/api/v1/sign-in" for 108.11.195.58 at 2017-02-03 17:22:26 +0000
Processing by Api::V1::SessionsController#create as JSON
  Parameters: {"email"=>"[email protected]", "password"=>"[FILTERED]"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)

NoMethodError (undefined method `[]' for nil:NilClass):

app/controllers/api/v1/sessions_controller.rb:7:in `create'

Что указывает на строку 7 моего SessionsController:

    ...
6          def create
7           resource = User.find_for_database_authentication(:email => params[:user_login][:email])
8            return invalid_login_attempt unless resource
    ...

В строке 7 есть два массива, но я не уверен, как они пусты в запросе Httpary и просто находят в запросе curl.


person Lenocam    schedule 03.02.2017    source источник
comment
params[:user_login][:email] -> params[:email], потому что {"email"=>"[email protected]", "password"=>"[FILTERED]"} не имеет :user_login   -  person phoet    schedule 03.02.2017
comment
Спасибо за комментарий. Мне потребовалось некоторое время, чтобы понять, как правильно указать :user_login.   -  person Lenocam    schedule 04.02.2017


Ответы (1)


Ответ на мой первый вопрос о том, что мне делать, если я снова столкнусь с этой или подобной проблемой, заключается в просмотре журналов Heroku. Так началось раскручивание моих проблем. Вторая часть этого ответа заключается в том, что даже когда я понял, что не отправлял информацию :user_login, я все еще не мог понять, как решить свою проблему, поэтому я начал бросать byebug в любое место, связанное с моей проблемой, и спрашивая каковы были значения моих переменных и запущенный код, чтобы увидеть вывод в консоли. Когда они продолжали возвращаться nil, и я не мог понять, какой правильный порядок/способ исправить запрос HTTParty, я начал ставить .methods или .instance_methods после моих переменных, чтобы найти больше способов спросить, что здесь происходит. После этого я провел некоторое время в консоли rails, используя любые instance_methods, которые были связаны с моими переменными, пока не собрал кусочки вместе.

Ответ на мой второй вопрос, что я делал не так? Я не отправлял :user_login, в основном потому, что не совсем понимал, что он должен был делать (я новичок, я использую много руководств, которые я понимаю примерно на 95%, это было из 5%) и даже когда я это сделал, я не мог понять, как засунуть это в свой запрос. Как оказалось, я также не использовал :body должным образом. Как только я понял, что мне нужно поместить :body во все данные, которые я отправлял, моим следующим слоем был :user_login, за которым последовали мои :email и :password, что, оглядываясь назад, теперь выглядит совершенно очевидным.

Вот как выглядит код для входа в мое приложение:

потреблять_api.rb

require "rubygems"
require "httparty"

response = HTTParty.post("https://fake-heroku-94488.herokuapp.com/api/v1/sign-in", :body => {:user_login => {:email => "[email protected]", :password => "password123"}})


puts response.body, response.code, response.message, response.headers.inspect
person Lenocam    schedule 03.02.2017