4

我有一个 URL 字符串,其中有换行符和回车符。例如

http://xyz.com/hello?name=john&msg=hello\nJohn\n\rgoodmorning&note=last\night I went to \roger

我的实际msg字符串在哪里:

hello
john
goodmorning

note字符串是

last\night I went to \roger

为了正确发送它,我必须对此进行 urlencode

 http://xyz.com/hello?name%3Djohn%26msg%3Dhello%5CnJohn%5Cn%5Crgoodmorning%26note%3Dlast%5Cnight%20I%20went%20to%20%5Croger

但是这个编码搞砸了\n和\r。虽然我希望 \n 应该转换为 %0A 和 \r 到 %0D

我写的代码是红宝石。我试图寻求帮助,Addressable::URI但还没有帮助。其他方法可能是将 \n 和 \r 分别手动替换为 %0A 和 %0D。但是该替换可以替换有效字符,例如我不想要的last\night字符。last%0Aight任何人都可以提出更好的解决方案吗?谢谢。

4

3 回答 3

13

关于什么CGI::escape

您只需要对参数进行编码。

url = "http://xyz.com/hello?"
params = "name=john&msg=hello\nJohn\n\rgoodmorning&note=last\night I went to \roger"

puts "#{url}#{CGI::escape(params)}"
# => "http://xyz.com/hello?name%3Djohn%26msg%3Dhello%0AJohn%0A%0Dgoodmorning%26note%3Dlast%0Aight+I+went+to+%0Doger"
于 2013-01-04T02:22:56.197 回答
3

这就是我使用Addressable::URI的方法:

require 'addressable/uri'

url = 'http://xyz.com/hello'

msg = 'hello
john
goodmorning'

note = "last\night I went to \roger"

uri = Addressable::URI.parse(url)
uri.query_values = {
  'msg'  => msg,
  'note' => note
}

puts uri.to_s

返回:

http://xyz.com/hello?msg=hello%0Ajohn%0Agoodmorning&note=last%0Aight%20I%20went%20to%20%0Doger

\rin\roger\nin被转换了,\night因为我使用了双引号分隔的字符串,而不是单引号分隔的字符串,单引号分隔的字符串将保留\r\n作为文字。

于 2013-01-04T04:11:39.537 回答
1

在 GET 请求中传递 json、引号等很棘手。在 Ruby 2+ 中,我们可以使用 Ruby 的 URI 模块的 'escape' 方法。

> URI.escape('http://app.com/method.json?agent={"account":
{"homePage":"http://demo.my.com","name":"Senior Leadership"}}')

但我建议将其用作 POST 请求并将其作为消息体传递。

于 2017-08-18T06:20:11.097 回答