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、quotesなどを渡すのは難しいです。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 に答える