#author("2022-04-02T05:58:58+00:00","default:src128","src128")
#author("2022-11-12T07:42:24+00:00","default:src128","src128")
*目次 [#b98c24f2]
#contents

*関連ページ [#a537bd7f]
-[[Ruby]]
-[[Mechanize]]

*URLの操作 [#if9f090e]

**URLからパス部分を削除する [#kd34d53e]
-[[Ruby/Rails 3.1: Given a URL string, remove path - Stack Overflow:https://stackoverflow.com/questions/6755919/ruby-rails-3-1-given-a-url-string-remove-path]]によると、URI.joinを使うのがよさげ。
#pre{{
uri = URI.join('https://softantenna.com/blog/ddd.html', '/')
=> #<URI::HTTPS https://softantenna.com/>
}}

**URLからフラグメントを削除する [#c5ac2c07]
-[[Removing a part of a URL with Ruby - Stack Overflow:https://stackoverflow.com/questions/10410523/removing-a-part-of-a-url-with-ruby]]の回答が簡単か。
#pre{{
parsed = URI::parse("http://www.domain.extension/folder?schnoo=schnok&foo=bar#frag")
parsed.fragment = parsed.query = nil
parsed.to_s

}}

**URIエンコード・デコードする [#ta4642c5]
-[[Ruby On Rails ピチカート街道 - rubyでURLエンコード -:http://rubist.blog77.fc2.com/blog-entry-49.html]]
***エンコード [#a7a86457]
#pre{{
require 'uri'
p URI.escape('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Rubyリファレンスマニュアル')
=> "http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB"
}}
***デコード [#b16c4a7d]
#pre{{
require 'uri'
p URI.unescape('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB')

=> "http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Rubyリファレンスマニュアル"
}}


*Tips [#de56f839]

**Net::HTTPでリクエスト [#s70a9ca7]
-以下のような感じで。
#pre{{
require 'net/http'
require 'uri'
require 'kconv'

uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
puts "get #{uri.request_uri}"
if uri.scheme == 'https'
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
response, = http.get(uri.request_uri) # request_uri=path + '?' + query
body = response.body
puts body
puts Kconv.guess(body)

}}

***uninitialized constant OpenSSL (NameError)が表示される [#u90ff1c9]
-上記コードでエラーが発生する場合、require 'net/http'をrequire 'net/https'に変更すること。
-Ruby 2.3.3までは上記コードで動いていたのだが、Ruby 2.3.4で動かなくなった。
-http.rbはopensslをautoloadしていて、https.rbはopensslを明示的にrequireしている。
-ここのところの挙動が変更になった模様(両バージョンの間でhttp.rb自体は全く同じことを確認) 。
-変更記録をみても不具合による修正なのかどうかは不明だった。


**OpenURIでリクエスト [#ofb57a33]
-以下のように使用できる
#pre{{
require 'open-uri'

url = ARGV.shift || 'http://www.srcw.net/'

#ブロック内部で読み込む
open(url) do |f| 
  puts f.read 
end

#openの戻り値を生かして読み込む
puts open(url).read
}}
**URIエンコード・デコードする [#ta4642c5]
-[[Ruby On Rails ピチカート街道 - rubyでURLエンコード -:http://rubist.blog77.fc2.com/blog-entry-49.html]]
***エンコード [#a7a86457]
#pre{{
require 'uri'
p URI.escape('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Rubyリファレンスマニュアル')
=> "http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB"
}}
***デコード [#b16c4a7d]
#pre{{
require 'uri'
p URI.unescape('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB')

=> "http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Rubyリファレンスマニュアル"
}}

**Digest認証でアクセスする [#ye8ccdee]
-net/httpもopen-uriも対応してないのか(?)
-[[RubyForge: WWW::Mechanize: Project Info:http://rubyforge.org/projects/mechanize/]]を使うのがいいらしい…


*トラブルシューティング [#c61ef954]

**Responseのencodingが ASCII-8BITになる [#y4fe1016]
-[[Feature #2567: Net::HTTP does not handle encoding correctly - Ruby master - Ruby Issue Tracking System:https://bugs.ruby-lang.org/issues/2567]]によると仕様なのか。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS