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

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

ただいまの
回答率

89.08%

(Ruby)クライアントからwebapiにリクエストを送るプログラムを作りたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 568
退会済みユーザー

退会済みユーザー

 下記の課題に取り組むために事前学習

QiitaでWebAPI調査し、非公開記事にまとめています。
→ web apiの学習まとめ
その上で、下記課題に取り組んでいます。

 解決したい課題

以下WebAPI3つ使って、ある「利用者ID」を与えて「利用者名」・「登録クラブ一覧」・「登録クラブポイント(point)」の出力プログラムをオブジェクト指向プログラミングで設計/実装しなさい。(URLは無効なURLです)

https://riko-19950120.herokuapp.com/users/1

/*レスポンス(例)*/
  {
    attributes: {
      id: 1,
      name: "Rico",
      club_ids: [
        1,
        3,
        5
      ]
    }
  }

https://riko-19950120.herokuapp.com/users/1/clubs

/*レスポンス(例)*/
[
  {
    attributes: {
      id: 1,
      user_id: 1,
      name: "ライザップクラブ",
      point: 15000
    }
  },
  {
    attributes: {
      id: 3,
      user_id: 1,
      name: "シックスパッドクラブ",
      point: 13000
    }
  },
  {
    attributes: {
      id: 5,
      user_id: 1,
      name: "ゴールドジムクラブ",
      point: 52000
    }
  }
]

https://riko-19950120.herokuapp.com/clubs/2

/*レスポンス(例)*/
{
  attributes: {
    id: 2,
    user_id: 2,
    name: "ビリーズブートキャンプクラブ",
    point: 2300
  }
}

 自分なりの回答

require 'net/http'
require 'openssl'
require 'uri'
require 'json'
require 'logger'

TIMEOUT_SECOND = 10

# HTTPSに使う時に必要??(今は横に置いておきました...。)
# url                = '' 
# https              = Net::HTTP.new(url,443)
# https.use_ssl      = true
# https.open_timeout = TIMEOUT_SECOND
# https.read_timeout = TIMEOUT_SECOND
# https.verify_mode  = OpenSSL::SSL::VERIFY_PEER
# https.verify_depth = 5

# Qiitaで見たメソッドをアレンジ)
def get_json(location,limit=10)

  raise ArgumentError, 'too many HTTP redirects' if limit == 0
  uri = URI.parse(location)

  begin
    response = Net::HTTP.start(uri.host,uri.port,use_ssl:uri.scheme == 'https') do |http|
      http.open_timeout = TIMEOUT_SECOND
      http.read_timeout = TIMEOUT_SECOND
      http.get(uri.request_uri)
    end

    case response
    when Net::HTTPSuccess
      json = response.body
      JSON.parse(json)

      ######## ここで「利用者名」・「登録クラブ一覧」・「登録クラブポイント(point)」を? ####


    when Net::HTTPRedirection
      location = response['location']
      warn "redirected to #{location}"
      get_json(location, limit - 1)
    else
      puts [uri.to_s, response.value].join(" : ")
      # handle error
    end
  rescue => e
    puts [uri.to_s,e.class,e].join(":")
  end
end

puts get_json('****URL??****')

んー...色々まだ考えることがありそうです。。。

 困っていること...。

 わからないこと       
オブジェクト指向での実装    オブジェクト志向の内容は理解をしていますが、プログラムに落とし込むことができていません。       
設問の「ある『利用者ID』を与えて」...の文言       引数idをどのように与えるように実装すればよいのか。クラスのイニシャライズに与えるべきか、メソッドに与えるべきなのかわかりません。   

ご助言頂ける方、よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

考えることが多すぎると、なかなか手が動かなかったりしますよね

「目的が何か」に依るところがありますが、簡素なものでもいいので1つ1つ動くものを作っていき、それらが協調して動くように、全体的に作っていってしまうのもよいかもしれません

たとえば今だとクライアント側のコードはあっても、サーバ側のコードがない(?)ので、それを先に作ってしまうのも手だと思います

# sinatra.rb
require 'sinatra'
require 'json'

# 指定URL の get 通信に応答する
# get ブロック内では params['id'] で実際の値が採れる
get '/users/:id' do
  # Note: 初期段階なので値は固定、他のことは考えない
  # TODO: クライアント側の実装が終わったら変動id 値で応答できるよう、メソッドに切り出し、ないしデータベースとの連携を検討する
  {
    attributes: {
      id: 1,
      name: 'Rico',
      club_ids: [
        1,
        2,
        5
      ]
    }
  }.to_json
end

# get '/users/:id/clubs' do
# ...
ruby sinatra.rb # => localhost:4567 で待ち受け開始

そして次はクライアント側の設計をし、実装をし、そしてまた サーバ側はどんなURL 形式、リソースの区切り方にするかの設計をし、サーバ側のコードを簡単に実装し、その次は... と、設計と実装の二人三脚をしていく...

最初から完璧を目指すのではなく、「作っては壊す」を素早く繰り返すことで、常に動く状態のものを1歩ずつ考えながら進めていくことができると思います

そうすれば自ずと、「ここの処理はメソッドに切り出して まとめたほうが良いかな」「このメソッド群はぜんぶユーザ関連だからクラスにまとめよう」という具合に、外の振る舞い(≒設計)に合わせて、内部のコードも整っていくように思います

何か参考になれば幸いです

 Links

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/27 12:37

    goufさんありがとうございます!1つ1つ砕いて少しずつ進めてみます。

    キャンセル

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

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る