【问题标题】:Adding PUT/DELETE to Ruby WEBrick将 PUT/DELETE 添加到 Ruby WEBrick
【发布时间】:2014-05-30 05:53:37
【问题描述】:

我正在尝试将 PUT 和 DELETE 动词添加到 WEBrick。我不需要他们做任何事情。他们只需要回复 200。下面是我正在运行的脚本。 GET 有效,但 DELETE 返回 405 并带有“不支持的方法 DELETE”消息。谁能告诉我这段代码有什么问题或缺失?

require 'webrick'

module WEBrick
  module HTTPServlet
    class ProcHandler
      alias do_PUT    do_GET
      alias do_DELETE do_GET
    end
  end
end

sRoot = "C:\\"

server = WEBrick::HTTPServer.new :Port => 8000, :DocumentRoot => sRoot

trap "INT" do server.shutdown end

server.start

【问题讨论】:

  • 您可能需要将 PUT 和 DELETE 添加到允许的方法列表中。搜索“不支持的方法”的来源。
  • 这是一件很奇怪的事情。为什么是 Webrick 而不是过去十年更新的东西?不要UnicornThin 正确执行此操作?
  • @tadman,webrick 随 Ruby 一起安装。我们不需要它来提供实际的网页。就像一些非常简单的测试的简单 HTTP 端点一样。 Webrick 在这种情况下获胜,因为它需要在将使用它的机器上进行零安装。
  • 就没有任何依赖而言,这只是一个小优势,但它却是一个巨大的劣势,因为按照今天的标准,它几乎没有功能。如果您可以在不使用任何外部依赖项的情况下编写整个应用程序,那会很有趣,但非常不寻常。
  • 这个问题中的脚本(顺便说一下“我如何让它工作?”)应用程序。

标签: ruby webrick


【解决方案1】:

我想通了。我必须向 DefaultFileHandler 添加适当的处理程序。 @kimmo,谢谢你的提示!

require 'webrick'

module WEBrick
  module HTTPServlet
    class FileHandler
      alias do_PUT    do_GET
      alias do_DELETE do_GET
    end

    class DefaultFileHandler
      def do_DELETE(req, res)
        res.body = ''
      end

      def do_PUT(req, res)
        res.body = ''
      end
    end
  end
end

sRoot = "C:\\"

server = WEBrick::HTTPServer.new :Port => 8000, :DocumentRoot => sRoot

trap "INT" do server.shutdown end

server.start

【讨论】:

  • 这对我不起作用。这适用于哪个版本的 Ruby?
【解决方案2】:

查看Rack's WEBrick implementation 也很有用。

机架覆盖WEBrick::HTTPServlet::AbstractServlet#service method

一个例子:

require 'webrick'

class TestServer < WEBrick::HTTPServlet::AbstractServlet
  def service(request, response)
    response.body = "#{request.request_method}:\n\t" +
      "#{request.inspect.lines.to_a.join("\t")}"
  end
end

server = WEBrick::HTTPServer.new Port: 8000
server.mount '/', TestServer
trap 'INT' do server.shutdown end
server.start

curl -X DELETE localhost:8000

给予

DELETE:
  DELETE / HTTP/1.1
  User-Agent: curl/7.35.0
  Host: localhost:8000
  Accept: */*

【讨论】:

  • 如果使用 def 服务,我使用 def do_GET,并为 do_POST、do_PUT 和 do_DELETE 创建别名
【解决方案3】:

肯特的回答对我不起作用...也许 WEBrick 已更新...

但它确实给了我线索。

  module HTTPServlet
    class ProcHandler
      alias do_PUT    do_GET
      alias do_DELETE do_GET
    end
  end

  @server = WEBrick::HTTPServer.new( config )
  @server.mount_proc '/' do | req, res |
    ...
  end

  @server.start

红宝石 2.2.3p173

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2010-09-25
    • 2012-02-26
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多