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

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

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

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

API

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

Q&A

解決済

1回答

5020閲覧

railsでhttpsのWEB APIの取得方法

katsun0921

総合スコア32

Ruby on Rails

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

API

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

0グッド

0クリップ

投稿2017/08/25 13:33

railsでhttpsのapiを取得する機能を作成したいと思っています。
indexのページにデータを取得したいと考えています。
ただ現状だと

use_ssl value changed, but session already started

と表示されてしまいます。この場合どうすればよいでしょうか?
参考にしたサイト
http://jumtech.hatenablog.jp/entry/2016/08/20/140720
http://qiita.com/mogulla3/items/a4bff2e569dfa7da1896

よろしくお願いいたします

controller

require 'net/https' require 'uri' require 'json' require 'logger' before_action :set_product, only: [:show, :edit, :update, :destroy] # GET /products # GET /products.json def index @products = Product.all .category_id(params[:category_id]) .page(params[:page]) @order_item = current_order.order_items.new # [ロガー] # カレントディレクトリのwebapi.logというファイルに出力 logger = Logger.new('./webapi.log') params = URI.encode_www_form({token: '0806af222da69296d9b5869b1374381466ae31f9'}) uri = URI.parse("https://www.sakenote.com/api/v1/sakes?#{params}") # @query = uri.query # [GETリクエスト] # Net::HTTP.startでHTTPセッションを開始する # 既にセッションが開始している場合はIOErrorが発生 response = Net::HTTP.start(uri.host, uri.port) do |http| # Net::HTTP.open_timeout=で接続時に待つ最大秒数の設定をする # タイムアウト時はTimeoutError例外が発生 # http.open_timeout = 5 # Net::HTTP.read_timeout=で読み込み1回でブロックして良い最大秒数の設定をする # デフォルトは60秒 # タイムアウト時はTimeoutError例外が発生 # http.read_timeout = 10 http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE # Net::HTTP#getでレスポンスの取得 # 返り値はNet::HTTPResponseのインスタンス http.get(uri.request_uri) end begin # [レスポンス処理] # 2xx系以外は失敗として終了することにする # ※ リダイレクト対応できると良いな.. # # ステータスコードに応じてレスポンスのクラスが異なる # 1xx系 => Net::HTTPInformation # 2xx系 => Net::HTTPSuccess # 3xx系 => Net::HTTPRedirection # 4xx系 => Net::HTTPClientError # 5xx系 => Net::HTTPServerError case response # 2xx系 when Net::HTTPSuccess # [JSONパース処理] # JSONオブジェクトをHashへパースする # JSON::ParserErrorが発生する可能性がある @sake = JSON.parse(response.body) @sakename = JSON.parse(response.body)["sakes"][0]["sake_name"] # 3xx系 # when Net::HTTPRedirection # リダイレクト先のレスポンスを取得する際は # response['Location']でリダイレクト先のURLを取得してリトライする必要がある # logger.warn("Redirection: code=#{response.code} message=#{response.message}") # else # logger.error("HTTP ERROR: code=#{response.code} message=#{response.message}") end # [エラーハンドリング] # 各種処理で発生しうるエラーのハンドリング処理 # 各エラーごとにハンドリング処理が書けるようにrescue節は小さい単位で書く # (ここでは全て同じ処理しか書いていない) rescue IOError => e logger.error(e.message) rescue TimeoutError => e logger.error(e.message) rescue JSON::ParserError => e logger.error(e.message) rescue => e logger.error(e.message) end end

view

<%= @sakename %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

Net::HTTP.start は、実行された時点で、TCP コネクションを張りますので、use_ssl が、設定できません。

Net::HTTP.new に変更して、TCPコネクションを張る前に use_ssl を設定してから、コネクションを張るように書き換えてください。

投稿2017/08/26 02:20

CHERRY

総合スコア25171

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

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

katsun0921

2017/08/26 09:50

CHERRYさんありがとうございます! https = Net::HTTP.new(uri.host,uri.port) https.use_ssl = true https.verify_mode = OpenSSL::SSL::VERIFY_NONE response = https.start にしたら、取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問