質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1147閲覧

encodeしたURIからホスト名の取得について(Ruby on Rails)

yamakin

総合スコア6

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/06/19 08:52

#前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

文字列には、hostメソッドはありません。

url = URI.parse("http://~~~~")
でしょう。

投稿2020/06/19 09:07

otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamakin

2020/06/19 09:32

回答ありがとうございます! 当初は uri = URI("文字列") でURIが取得できていたため、.encodeをつけるだけでエンコードされたURIが取得できるものと思い込んでしまっていました。 おかげさまで正しくURIが取得できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問