【Rails】Qiita APIを使ってRailsに関する記事を取得する

# はじめに
お疲れさまです。
おおくまです。

[前回](https://qiita.com/kumaryoya/items/eafbc5063e60e3aaa4d5)に引き続きAPIについてです。
今回は、**Qiita API**を使ってRailsでミニアプリを作ってみました。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# アクセストークンを取得する
それでは、[Qiita APIのドキュメント](https://qiita.com/api/v2/docs)に沿って実装していきたいと思います。
まず、初めに**アクセストークン**を取得します。
アクセストークンを取得しなくてもAPIを利用することはできますが、認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までという[利用制限](https://qiita.com/api/v2/docs#%E5%88%A9%E7%94%A8%E5%88%B6%E9%99%90)があります。
今回はアクセストークンを取得して実装していきます。

① Qiitaにログインした状態で、右上のユーザーアイコンをクリックし、ドロップダウンメニューから「設定」を選択します。
② 左側のメニューから「アプリケーション」を選択します。
③ 「新しくトークンを発行する」をクリックします。
④ トークンに名前を付けて、[スコープ](https://qiita.com/api/v2/docs#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)を選択します。（今回は、「read_qiita」にのみチェック）
⑤ 「発行する」ボタンをクリックしてアクセストークンを取得します。
⑥ アクセストークンが表示されるので控える。

# 実装
今回は**一昨日から今日にかけて投稿された「Rails」タグが付いたQiita記事一覧**を取得し、表示するアプリを作っていきます。
<br>

まずは、ルーティングを定義します。
```ruby:routes.rb
resources :qiitas, only: %i[index]
```
<br>

次に、コントローラーを書いていきます。
```ruby:qiitas_controller.rb
class QiitasController < ApplicationController
  require 'net/http'

  def index
    two_days_before = (Date.today - 2).strftime("%Y-%m-%d")
    query = "created:>=#{two_days_before} tag:Rails"
    url = URI.parse("https://qiita.com/api/v2/items?query=#{URI.encode_www_form_component(query)}")
    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = true
    request = Net::HTTP::Get.new(url)
    request['Authorization'] = "Bearer #{ENV['QIITA_ACCESS_TOKEN']}"
    response = http.request(request)
    @articles = JSON.parse(response.body)
  end
end
```
<br>

``require 'net/http'``
net/httpライブラリをインクルードします。
これは、HTTPリクエストを送信するためのRubyの標準ライブラリです。

``two_days_before = (Date.today - 2).strftime("%Y-%m-%d")``
一昨日の日付を取得し、strftime メソッドを使用してフォーマットを変換し、two_days_beforeに代入します。

``query = "created:>=#{two_days_before} tag:Rails"``
queryに、一昨日以降に投稿された「Rails」タグが付いたQiita記事を検索するためのクエリを代入します。

``url = URI.parse("https://qiita.com/api/v2/items?query=#{URI.encode_www_form_component(query)}")``
urlに、Qiita APIのエンドポイントとクエリを組み合わせたURIオブジェクトを代入します。
URI.encode_www_form_componentはクエリ文字列をエンコードするために使用されています。

``http = Net::HTTP.new(url.host, url.port)``
httpに、Qiita APIへのHTTPリクエストを送信するためのNet::HTTPオブジェクトを代入しています。

``http.use_ssl = true``
SSLを使用することを示しています。

``request = Net::HTTP::Get.new(url)``
Qiita APIから記事一覧を取得するために、requestに、HTTP GETリクエストを代入しています。

``request['Authorization'] = "Bearer #{ENV['QIITA_ACCESS_TOKEN']}"``
先ほど取得した、アクセストークンを[``.env``](https://github.com/bkeepers/dotenv)ファイルに書き込みます。
リクエストヘッダーに、アクセストークンを環境変数「QIITA_ACCESS_TOKEN」として設定します。
これにより、APIへの認証が可能になります。

``response = http.request(request)``
httpオブジェクトを使用してHTTPリクエストを送信し、その結果をresponseに代入しています。

``@articles = JSON.parse(response.body)``
response.bodyから取得したJSONデータをパースして、@articlesに代入します。
これにより、Qiitaから取得した記事のデータがビューに渡されます。
<br>

最後に、ビューを書いていきます。
```ruby:index.html.erb
<div class="bg-qiita font-qiita items-center justify-center text-center pt-20 pb-12">
  <div class="text-secondary text-4xl pb-2">Railsちゃんねる</div>
  <div class="text-secondary text-2xl pb-2">一昨日から今日にかけて投稿された「Rails」タグが付いたQiita記事一覧</div>
  <div class="text-secondary text-xl pb-20">※リンク先は外部のウェブサイトです</div>
  <div class="font-qiita">
    <% @articles.each do |article| %>
      <ul class="link link-hover text-lg"><%= link_to "・#{article['title']}", "#{article['url']}", target: :_blank, rel: "noopener noreferrer" %></ul>
      <ul class="text-base mb-8">投稿日 <%= DateTime.parse(article['created_at']).strftime("%Y-%m-%d") %></ul>
    <% end %>
  </div>
</div>
```

# 動作確認
![スクリーンショット 2023-09-25 16.22.17 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/47ec2607-37a4-e757-5bd8-d38e91f1100a.jpeg)
無事に表示されました。

# 最後に
今回はAPIのエンドポイントとクエリを組み合わせてリクエストを送るということができました。
最後まで読んでいただきありがとうございました。