【Ruby】HTTP通信でPOSTリクエストを送る

# はじめに
Yahooのルビ振りAPIを使用するため、net/httpライブラリを使ってPOSTの実装を行った記録です。

https://developer.yahoo.co.jp/webapi/jlp/sample/sample10.html

# 実装例１
- Net::HTTP#postでフォームの情報をサーバに送信する
```ruby
require 'net/http'
require 'uri'
require 'json'

  def post
    app_id = "hogehogehogehogehoge"  #  Yahoo APIのClient ID（アプリケーションID）
    url = "https://jlp.yahooapis.jp/FuriganaService/V2/furigana"

    headers = {
      "Content-Type" => "application/json",
      "User-Agent" => "Yahoo AppID: " + app_id,
    }

    param_dic = {
      "id": request_id,
      "jsonrpc": "2.0",
      "method": "jlp.furiganaservice.furigana",
      "params": {
        "q": "hoge",  # 入力された文字列
        "grade": 1
      }
    }

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

    response = http.post(uri.path, param_dic.to_json, headers)
  end
```

### 解説
#### ` uri = URI.parse(url)`
- 与えられたURIから該当するURI::Genericのサブクラスのインスタンスを生成して返す
```
require 'uri'
uri = URI.parse("https://jlp.yahooapis.jp/FuriganaService/V2/furigana")
=> #<URI::HTTPS https://jlp.yahooapis.jp/FuriganaService/V2/furigana>
p uri.scheme
=> "https"
p uri.host
=> "jlp.yahooapis.jp"
p uri.port
=> 443
p uri.path
=> "/FuriganaService/V2/furigana"
```
https://docs.ruby-lang.org/ja/latest/method/URI/s/parse.html
####  `Net::HTTP.new(uri.host, uri.port)`
- Net::HTTPオブジェクトを生成する
  - Net::HTTPはHTTPのクライアントのためのクラス

https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/s/new.html
#### ` http.use_ssl = true`
- HTTPでSSL/TLSを使用する場合はtrueを設定する
- デフォルトはfalse

https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/i/use_ssl=3d.html

#### `response = http.post(uri.path, param_dic.to_json, headers)`

- `post(path, data, header = nil, dest = nil)` でサーバ上のpathにあるエンティティに対して文字列dataをPOSTで送る
- 返り値はNet::HTTPResponseクラスのオブジェクト
  - Net::HTTPResponseはHTTP レスポンスを表現するクラス。 Net::HTTP クラスは実際には HTTPResponse のサブクラスを返す
 

https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/i/post.html


# 実装例２（より細かく制御する）
- Net::HTTPRequestクラス（HTTP リクエストを抽象化するクラス）のサブクラスであるNet::HTTP::Post（HTTP の POST リクエストを表すクラス）のリクエストオブジェクトを生成する
- Net::HTTP＃requestでリクエストをサーバに送信する
```diff
require 'net/http'
require 'uri'
require 'json'

  def post
    app_id = "hogehogehogehogehoge"  #  Yahoo APIのClient ID（アプリケーションID）
    url = "https://jlp.yahooapis.jp/FuriganaService/V2/furigana"

    headers = {
      "Content-Type" => "application/json",
      "User-Agent" => "Yahoo AppID: " + app_id,
    }

    param_dic = {
      "id": request_id,
      "jsonrpc": "2.0",
      "method": "jlp.furiganaservice.furigana",
      "params": {
        "q": "hoge",  # 入力された文字列
        "grade": 1
      }
    }

    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

+   request = Net::HTTP::Post.new(uri.path, headers) 
+   response = http.request(request)
-   response = http.post(uri.path, param_dic.to_json, headers) 
  end
```

### 解説
#### `request = Net::HTTP::Post.new(uri.path, headers)`
- `new(path, initheader = nil)` でHTTP リクエストオブジェクトを生成する

https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTPRequest/s/new.html
#### ` response = http.request(request)`
- `request(request, data = nil)`でリクエストオブジェクトをサーバに送信する
- 返り値はNet::HTTPResponseクラスのオブジェクト 

https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aHTTP/i/request.html