ruby-on-rails - 为什么发送空 POST 请求时会出现内部错误 500

标签 ruby-on-rails http post

我在 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/

相关文章:

ruby-on-rails - 不知道如何构建任务 'routes'

ruby-on-rails - 提示的事件资源需要散列

ruby-on-rails - 编辑表单中的序列化哈希?

ios - iPhone 如何使用 json 发布 nsarry

java - 使用 Jsoup 登录网站并停留在该网站上

ruby-on-rails - 如何使用 Ruby 比较两个表

http - 使用原始 HTTP (PuTTY) 通过 POST 发送文件

HTTP 与 RemoteProcedureCalls

http - 内容安全策略不起作用

iOS AFNetworking 发布问题