Я пишу приложение, которое запускает Sinatra в качестве фонового потока для предоставления API.
Я определил маршрут для GET, который работает нормально, но когда я пытаюсь опубликовать, я продолжаю видеть, что он терпит неудачу в WEBrick в том же месте. Ошибка:
[2018-01-18 20:43:05] ERROR NoMethodError: undefined method `each' for nil:NilClass
/Users/atkinsb/.gem/ruby/2.4.0/gems/rack-2.0.3/lib/rack/handler/webrick.rb:90:in `service'
/Users/atkinsb/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/httpserver.rb:140:in `service'
/Users/atkinsb/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/httpserver.rb:96:in `run'
/Users/atkinsb/.rbenv/versions/2.4.2/lib/ruby/2.4.0/webrick/server.rb:290:in `block in start_thread'
::1 - - [18/Jan/2018:20:43:05 GMT] "POST /message HTTP/1.1" 500 320
- -> /message
Я думаю, что проблема в строке 86:
status, headers, body = @app.call(env)
Это всегда возвращает ноль для всех трех переменных, когда я делаю сообщение.
post '/message' do
ApiServer::Base::SM.message(JSON.parse(request.body.read))
end
Тело поста:
{
"id": "1",
"sender": "localhost",
"action": "SYS_NORMAL_SHUTDOWN",
"payload": "",
"ack": "0",
"date_time": "2018-01-18 08:58:50 +0000"
}
Я отправляю с заголовком в почтальоне:
Content-Type application/json
Я озадачен этим. Любая идея, что я делаю неправильно?
PS. Я забыл упомянуть, что тело json анализируется в маршруте нормально...
Также тело, возвращенное с почты:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<TITLE>Internal Server Error</TITLE>
</HEAD>
<BODY>
<H1>Internal Server Error</H1>
undefined method `each' for nil:NilClass
<HR>
<ADDRESS>
WEBrick/1.3.1 (Ruby/2.4.2/2017-09-14) at
localhost:4567
</ADDRESS>
</BODY>
</HTML>
halt
со статусом, 201 или 202 (это нелюбимые, но полезные коды :), например.halt 202, '{ "status": "Message Received" }'
. Это не только позволит избежать ошибок, подобных той, которую вы нашли, но также прояснит, что вы ожидаете вернуть, и что вы не ожидаете, что страница будет возвращена для рендеринга.:provides => :json
в качестве условия маршрута помогает внести ясность, также заполняя заголовок Accepts. 19.01.2018