5

我有以下代码:

    http = Net::HTTP.new("www.something.com", 80)
    http.set_debug_output($stdout)
    http.post("/blah", "something", {'random-parameter' => 'value1="something",value2="somethingelse"'})

然后当我从标准输出读取输出时,它看起来像这样:

<- "POST /blah HTTP/1.1\r\nAccept: */*\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nrandom-parameter: value1=\"something\",value2=\"somethingelse\"\r\nContent-Length: 9\r\nHost: www.something.com\r\n\r\n"
<- "something"

引号被转义。问题是斜杠似乎被发送到服务器,它不喜欢那样。我收到一条错误消息

Unknown value for random-parameter in header: {value1=\\\"something\\\"value2=\\\"somethingelse\\\"}

所以我的问题是,有没有办法告诉 Net::HTTP 不要插入这些斜杠,或者在发送标头之前将它们去掉?

说明:

我将 Ruby 1.8.7 与 Rails 2.0.2 一起使用。

我认为可能是 Rails 正在逃避角色,但我不知道如何让它停止。

4

2 回答 2

2

你确定你正确地建立了标题吗?Net::HTTP 在发送请求时不引用引号。您可以使用例如 netcat (nc) 轻松验证它:

1号航站楼:

> nc -v -l -p 2323

2 号航站楼(irb):

> http = Net::HTTP.new("localhost", 2323)
> http.post("/blah", "something", {'random-parameter' => ... )

结果(在终端 1):

listening on [any] 2323 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 37598
POST /blah HTTP/1.1
Connection: close
Accept: */*
Random-Parameter: value1="something",value2="somethingelse"
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
Host: localhost:2323

something

我认为您实际上可能想要做的事情(不确定,但我猜)更像是 HTTP 规范的内容:

> http.post("/blah", "something", {
    'random-parameter' => 'value1="something"; value2="somethingelse"' })

Rails 可能将您的第一个 value1=... 解释为整个值..当您可能需要用';'而不是','分隔值时。

另请注意,您通常不会通过请求标头传递参数。但也许这就是您在这种情况下想要做的(?)否则您应该像 param1=foo¶m2=bar 那样在 URL 本身中传递参数,或者使用 x-www-form-urlencoded 来传递参数。

请参阅此处获取备忘单:
http ://www.rubyinside.com/nethttp-cheat-sheet-2940.html

于 2011-07-01T18:21:33.240 回答
0

您的名称/值对是“随机参数”的值不是问题吗,因此需要对它们进行转义。

我希望当您检查控制器方法中的随机参数值时,它不会有斜线 - 您可以调试代码或打印参数以查看接收到的内容吗?

于 2011-06-27T13:39:21.797 回答