2016-04-12 7 views
-1

私が持っているURLのように:私のブラウザで使用ハッシュ値RestClient

http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das

私はそのURLからデータを取得することができますが、私は、使用鋸山をしていた場合

Nokogiri::HTML(open('http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das')) 

私はRestClient

でも

URI::InvalidURIError: bad URI(is not URI?): http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das 
from /home/worka/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/uri/common.rb:176:in `split' 

取得します0

RestClient.get 'http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das' 

同じエラーが発生しました。

+0

'Nokogiri :: HTML(open( 'http://google.com/test?data= {" foo ":" bar "、" joe ":" doe "}&sign = x6das'))' => 'OpenURI :: HTTPError:404見つかりません '。あなたのURIを書くことができますか? – Ilya

+0

@Ilya私はstackoverflowでオリジナルのuriを書くのは悪い考えだと思っていますが、私は元のurlを私のquetionでよく編集します。 – itx

+0

Nokogiriは悪いURIとは関係ありません。そのレベルのコードを認識せず、渡されたストリームのみを読み込み、結果の文字列を解析します。 OpenURIまたはRestClientは、そのエラーを返すレイヤーです。コード内のどのコンポーネントが何をするのかを理解することは重要です。 Nokogiriのリファレンスとタグを削除し、OpenURIで置き換えてください。あなたの質問はもっと理にかなっています。 –

答えて

0

あなたのURLを最初にエンコードしてから使用してください。

url = 'http://172.0.0:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das' 
encoded_url = CGI::escape(url) 
Nokogiri::HTML(open(encoded_url)) 
+0

'Errno :: ENAMETOOLONG:ファイル名が長すぎます@ rb_sysopen' – itx

-1

[OK]を私はURIを扱う場合には、そのようなルビーが付属してURI、として彼らのために設計されたツールを使用することをお勧めします

url = http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das 
RestClient.get(URI.encode(url.strip)) 
+1

残念ながら、あなたのコードは実行されません。あなたは 'url'を正しく宣言しませんでした。 –

+0

それは宣言urlについてではなく、どのように私はそのようなURLを扱うために解決することができますし、私は[この質問から]私の問題のための有用な解決策を見つけた(http://stackoverflow.com/questions/15700784/ハウツー・フィックス・バール・ウィル・ノー・ウィル・ノー・ウィル・ノー)、それが私のために働いています。 – itx

0

私の問題を解決しました。 dataコンポーネントが無効であるため

URIは

http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das 

ことができません。あなたがdataを追加する場合、私はで始まるたい:

require 'uri' 

uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das') 
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"} 
data = {"foo" => "bar","joe" => "doe"} 
uri.query = URI.encode_www_form(query.merge(data)) # => "sign=x6das&foo=bar&joe=doe" 
uri.to_s # => "http://172.0.0.1:22230/test.action?sign=x6das&foo=bar&joe=doe" 

{"foo":"bar","joe":"doe"}を使用してあなたの最初の例では、通常、そのようなURLで渡されていないJSONシリアライズされたデータです。あなたはJSONを作成する必要がある場合は、最初のハッシュで始まる:

data = {"foo" => "bar","joe" => "doe"} 

uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das') 
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"} 
uri.query = URI.encode_www_form(query.merge('data' => data.to_json)) # => "sign=x6das&data=%7B%22foo%22%3A%22bar%22%2C%22joe%22%3A%22doe%22%7D" 

しかし、再び、エンコードされたJSONを送信する:

require 'json' 

data = {"foo" => "bar","joe" => "doe"} 
data.to_json # => "{\"foo\":\"bar\",\"joe\":\"doe\"}" 

to_jsonは、URIにエンコードすることができ、文字列の中にハッシュをシリアライズURIのクエリパラメータは非常に一般的でも標準的でもないため、データペイロードはJSONエンコーディングなしで小さくなります。