0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

#Ruby の Faraday とは? get リクエストで https 接続してみる例

Last updated at Posted at 2019-11-02

Faraday って何よ

Ralsで使われているけど、ほとんど何してるか知らなかった。

ネットワーク接続まわりの何かだという漠然としたイメージだった。

HTTP クライアントだということさえ知らなかった。生きててごめんなさい。

Simple, but flexible HTTP client library, with support for multiple backends.

lostisland/faraday: Simple, but flexible HTTP client library, with support for multiple backends.

インストール

gem install faraday

get リクエストを送ってみる

https アクセスするにも1行で書ける。

Faraday.get('https://example.com')

これだけ。

あー、あの Rails でもよく見るやつだ!

(と思ったのだが、デフォルトではなくて利用しているgemのdependencyかもしれない)

image

[13] pry(main)> Faraday::Connection.new(url: 'https://example.com').get
=> #<Faraday::Response:0x00007fe48b0bfb40
 @env=
  #<struct Faraday::Env
   method=:get,
   body=
    "<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type=\"text/css\">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n",
   url=#<URI::HTTPS https://example.com/>,
   request=
    #<struct Faraday::RequestOptions
     params_encoder=nil,
     proxy=nil,
     bind=nil,
     timeout=nil,
     open_timeout=nil,
     write_timeout=nil,
     boundary=nil,
     oauth=nil,
     context=nil>,
   request_headers={"User-Agent"=>"Faraday v0.17.0"},
   ssl=
    #<struct Faraday::SSLOptions
     verify=true,
     ca_file=nil,
     ca_path=nil,
     verify_mode=nil,
     cert_store=nil,
     client_cert=nil,
     client_key=nil,
     certificate=nil,
     private_key=nil,
     verify_depth=nil,
     version=nil,
     min_version=nil,
     max_version=nil>,
   parallel_manager=nil,
   params=nil,
   response=#<Faraday::Response:0x00007fe48b0bfb40 ...>,
   response_headers=
    {"cache-control"=>"max-age=604800",
     "content-type"=>"text/html; charset=UTF-8",
     "date"=>"Sat, 02 Nov 2019 09:25:33 GMT",
     "etag"=>"\"3147526947+gzip\"",
     "expires"=>"Sat, 09 Nov 2019 09:25:33 GMT",
     "last-modified"=>"Thu, 17 Oct 2019 07:18:26 GMT",
     "server"=>"ECS (sjc/4E44)",
     "vary"=>"Accept-Encoding",
     "x-cache"=>"HIT",
     "content-length"=>"648",
     "connection"=>"close"},
   status=200,
   reason_phrase="OK">,
 @on_complete_callbacks=[]>

response

返ってきた response に対して重宝するメソッドが生えている。

controller でいつもお世話になってます。

status / headers / body

response = Faraday.get('https://example.com')

response.status
response.headers
response.body

image

[22] pry(main)> response.status
=> 200
[23] pry(main)> response.headers
=> {"accept-ranges"=>"bytes",
 "cache-control"=>"max-age=604800",
 "content-type"=>"text/html; charset=UTF-8",
 "date"=>"Sat, 02 Nov 2019 09:26:32 GMT",
 "etag"=>"\"3147526947+gzip\"",
 "expires"=>"Sat, 09 Nov 2019 09:26:32 GMT",
 "last-modified"=>"Thu, 17 Oct 2019 07:18:26 GMT",
 "server"=>"ECS (sec/96ED)",
 "vary"=>"Accept-Encoding",
 "x-cache"=>"HIT",
 "content-length"=>"648",
 "connection"=>"close"}
[24] pry(main)> puts response.body
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
=> nil
[25] pry(main)> 

POST リクエストの例

良さ!

Faraday.post "http://httpbin.org/post", {hey: 'You'}

[34] pry(main)> Faraday.post "http://httpbin.org/post", {hey: 'You'}
=> #<Faraday::Response:0x00007fe489788528
 @env=
  #<struct Faraday::Env
   method=:post,
   body=
    "{\n  \"args\": {}, \n  \"data\": \"\", \n  \"files\": {}, \n  \"form\": {\n    \"hey\": \"You\"\n  }, \n  \"headers\": {\n    \"Accept\": \"*/*\", \n    \"Accept-Encoding\": \"gzip;q=1.0,deflate;q=0.6,identity;q=0.3\", \n    \"Content-Length\": \"7\", \n    \"Content-Type\": \"application/x-www-form-urlencoded\", \n    \"Host\": \"httpbin.org\", \n    \"User-Agent\": \"Faraday v0.17.0\"\n  }, \n  \"json\": null, \n  \"origin\": \"103.5.142.120, 103.5.142.120\", \n  \"url\": \"https://httpbin.org/post\"\n}\n",
   url=#<URI::HTTP http://httpbin.org/post>,
   request=
    #<struct Faraday::RequestOptions
     params_encoder=nil,
     proxy=nil,
     bind=nil,
     timeout=nil,
     open_timeout=nil,
     write_timeout=nil,
     boundary=nil,
     oauth=nil,
     context=nil>,
   request_headers={"User-Agent"=>"Faraday v0.17.0", "Content-Type"=>"application/x-www-form-urlencoded"},
   ssl=
    #<struct Faraday::SSLOptions
     verify=true,
     ca_file=nil,
     ca_path=nil,
     verify_mode=nil,
     cert_store=nil,
     client_cert=nil,
     client_key=nil,
     certificate=nil,
     private_key=nil,
     verify_depth=nil,
     version=nil,
     min_version=nil,
     max_version=nil>,
   parallel_manager=nil,
   params=nil,
   response=#<Faraday::Response:0x00007fe489788528 ...>,
   response_headers=
    {"access-control-allow-credentials"=>"true",
     "access-control-allow-origin"=>"*",
     "content-type"=>"application/json",
     "date"=>"Sat, 02 Nov 2019 09:35:17 GMT",
     "referrer-policy"=>"no-referrer-when-downgrade",
     "server"=>"nginx",
     "x-content-type-options"=>"nosniff",
     "x-frame-options"=>"DENY",
     "x-xss-protection"=>"1; mode=block",
     "content-length"=>"277",
     "connection"=>"Close"},
   status=200,
   reason_phrase="OK">,
 @on_complete_callbacks=[]>

REf

Ruby HTTPクライアントの比較表 - Qiita
Ruby の HTTP クライアントライブラリ Faraday が便利そう

Original by Github issue

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

Twitter

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?