#前提・実現したいこと
Ruby on Railsを使用し、APIを使い情報を得るため日本語を含むURLからリクエストの作成を試みています。
#発生している問題・エラーメッセージ
そこでリクエストを作成するために、日本語を含むurlをURI.encodeで変換し、次にNet::HTTP.new(uri.host, uri.port)で第一引数の接続するホスト名を文字列で指定すると、
NoMethodError: undefined method `host' for #<String:0x00007fe5bc53ae68>
といったエラーが吐かれます。
#該当のソースコード
Ruby
1 require 'uri' 2 require 'net/http' 3 require 'openssl' 4 5 url = URI.encode("日本語パラメータを含むURL") 6 #uri = URI.decode(url) 7 8 http = Net::HTTP.new(url.host, url.port) 9 #http = Net::HTTP.new(uri.host, uri.port) 10 http.use_ssl = true 11 http.verify_mode = OpenSSL::SSL::VERIFY_NONE 12 13 request = Net::HTTP::Get.new(url) 14 request["x-rapidapi-host"] = 'ホスト' 15 request["x-rapidapi-key"] = 'APIキー' 16 17 response = http.request(request)
#試したこと
URIの下にdecodeしたURIを生成する記述をしてhostを取り出そうとしても同じエラーが出ました。(コメントアウトしてある部分)URLに日本語が入るので違うエラーが出るものと思いました。
日本語のところをアルファベットにして(encodeせずにURIを生成した場合、リクエストの送信が成功する文字列)にencodeを行なったURIからhost名を取り出そうとした場合も同じエラーだったので、encodeをすることで何かが変化していると思ったものの、binding.pryでパラメータを確認したところ同じに見えます。下はURLに含まれている該当のパラメータ部分です。
Ruby
1日本語をencodeした場合(本来実現しようとしていたこと) 2?query=日本語 #encode前 3?query=%E3%83%90%E3%83%B3%E3%82%B3%E3%82%AF #encode後 4 5英語をencodeした場合(encodeしなければhost名がうまくいく文字列) 6?query=english #encode前 7?query=english #encode後
encodeによってhost名が取得できなくなると思ったのですが、何が変わってhost名が取得できなくなっているのかが私にはわかりませんでした。
とてもわかりにくい文章かもしれないですがお知恵をお貸しいただければ光栄です。
#補足情報(FW/ツールのバージョンなど)
Rails 5.0.7.2
Ruby 2.5.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/19 09:32