【问题标题】:Using Ruby to post an XML request to a webserver使用 Ruby 将 XML 请求发布到网络服务器
【发布时间】:2012-01-31 23:41:32
【问题描述】:

恐怕我在通过网络服务器发布文档(例如 XML)方面没有太多经验,所以如果我对 HTTP 的理解不足,我深表歉意。

我在 127.0.0.1 端口 2000 上的 ruby​​ 应用程序中设置了一个基本的 Mongrel Web 服务器。 (服务器)。

我在同一台计算机上运行一个单独的 Ruby 应用程序。 (客户)。

我需要客户端将 XML 文档 POST 到服务器。

我曾尝试使用 Net::HTTP 来执行此操作,但我找不到一个明确的示例来告诉我应该做什么。 我试过了,但遇到了错误。我已将请求分解以使其尽可能基本:

http = Net::HTTP.new("127.0.0.1", 2000)
http.post('file', 'query=foo') #xc.rb line 6

但它会导致以下错误

    C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:141:in `read_nonblock': An existing connection was forcibly closed by the remote host. (Errno::ECONNRESET)
    from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:141:in `rbuf_fill'
    from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
    from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:2551:in `read_new'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1293:in `request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1286:in `block in request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:745:in `start'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1284:in `request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1307:in `send_entity'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1096:in `post'
    from W:/Ruby/A/xc.rb:6:in `<main>'

我想我做错了。请您给我一个示例(或指向我的教程),该示例应该允许我发布一些基本数据,例如"&lt;tag1&gt;text&lt;/tag1&gt;"。希望我能够设置适当的标头并处理响应。

另外,我不需要使用 net/http;任何没有额外商业用途许可限制的免费方法都可以。

【问题讨论】:

  • 您正在尝试调试客户端。但是您是否证明服务器运行正常?
  • 我通过网络浏览器访问相同的 URL,并且服务器在请求上正确地执行了p(我还没有设置它来做任何其他事情)。通过客户端连接时,服务器报告它正在接收格式错误的 HTTP 请求HTTP parse error, malformed request (127.0.0.1): #&lt;Mongrel::HttpParserError: Invalid HTTP format, parsing fails.&gt;。我很确定只是我不知道如何正确地将数据发布到服务器。如果我能找出我应该怎么做,我可以在必要时从那里调试。

标签: ruby http post client net-http


【解决方案1】:

使用 rest-client gem 时,这非常简单

require 'rest-client'

response = RestClient.post "http://127.0.0.1:2000", "<tag1>text</tag1>", :content_type => "text/xml"

【讨论】:

  • 如果检查请求服务器日志,参数将是{"tag1"=&gt;"text"},而不是普通的"&lt;tag1&gt;text&lt;/tag1&gt;"。这是为什么呢?
  • 我不知道。如果你想要一个答案,你真的应该把它当作一个新问题来问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多