我在 Rails 4.0 中开发 API 并尝试使用 Postman 对其进行测试。我不断收到 500 状态代码作为空主体 POST 请求的答案。
我是否使用正确的 url 并不重要。似乎不可能在 Rails 中处理空的 POST 请求。当我用 PUT、DELETE 等尝试时,没有问题。
要求:
POST /whatever HTTP/1.1
Host: localhost:3000
Cache-Control: no-cache
Postman-Token: c479c760-214d-93f0-3a49-2a11c95758f4
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
响应头:
Connection
Options that are desired for the connection
close
Content-Length
The length of the response body in octets (8-bit bytes)
296
Content-Type
The mime type of this content
text/html; charset=ISO-8859-1
Date → Fri, 22 May 2015 13:57:57 GMT
Server → WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26)
响应正文
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD><TITLE>Internal Server Error</TITLE></HEAD>
<BODY>
<H1>Internal Server Error</H1>
bad content body
<HR>
<ADDRESS>
WEBrick/1.3.1 (Ruby/2.2.1/2015-02-26) at
localhost:3000
</ADDRESS>
</BODY>
</HTML>
服务器日志:
[2015-05-22 16:12:57] ERROR EOFError: bad content body
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/multipart/parser.rb:96:in `block in fast_forward_to_first_boundary'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/multipart/parser.rb:94:in `loop'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/multipart/parser.rb:94:in `fast_forward_to_first_boundary'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/multipart/parser.rb:53:in `parse'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/multipart.rb:25:in `parse_multipart'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/request.rb:373:in `parse_multipart'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/request.rb:207:in `POST'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/methodoverride.rb:39:in `method_override_param'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/methodoverride.rb:27:in `method_override'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/methodoverride.rb:15:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/runtime.rb:18:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/lock.rb:17:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/static.rb:113:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/sendfile.rb:113:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/engine.rb:518:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/application.rb:164:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/lock.rb:17:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/content_length.rb:15:in `call'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/rack-1.6.1/lib/rack/handler/webrick.rb:89:in `service'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
/Users/fufu/.rbenv/versions/2.2.1/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'
最佳答案
我也遇到了这个问题,似乎 Postman
在没有定义 POST 参数时发送了一个 empty body
。这会使 rails 多部分解析器出错,因为没有应该包围请求主体的 ----WebKitFormBoundary7MA4YWxkTrZu0gW 边界定界符
,因此出现意外的 EOF。解决方案是改用 x-www-form-urlencoded
(Postman 中 Body 下的 4 个选项之一)。
关于ruby-on-rails - 为什么发送空 POST 请求时会出现内部错误 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398499/