Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyでのHTTPリクエストの究極のガイド

ウェブサイトから情報を入手したい場合、またはフォームを送信したり、ファイルをアップロードしたりする場合。

HTTPリクエストを送信してから、レスポンスを処理する必要があります。

この記事では、その方法を学びます

  • net/httpを使用して単純なHTTPリクエストを作成します
  • SSLリクエストを送信する
  • POSTリクエストを使用してデータを送信する
  • カスタムヘッダーを送信する
  • 状況に最適なHTTPクライアントを選択してください

やってみましょう!

HTTPリクエストを送信する方法

Rubyには組み込みのhttpクライアントが付属しています。これはnet/httpと呼ばれ、必要なあらゆる種類のリクエストを送信するために使用できます。

これがnet/httpの例です :

require 'net/http'

Net::HTTP.get('example.com', '/index.html')

これにより、ページのHTMLコンテンツを含む文字列が返されます。

しかし、多くの場合、HTMLコンテンツ以上のものが必要です。

HTTP応答ステータスのように 。

応答ステータスがないと、リクエストが成功したのか、失敗したのかわかりません。

これがあなたがそれを得る方法です

response = Net::HTTP.get_response('example.com', '/')

response.code
# 200

ここで、応答コンテンツが必要な場合は、bodyを呼び出します。 方法:

response.body

HTTPartyGemの使用方法

物事を簡単にすることができる多くの宝石があります。

これらの宝石の1つはhttpartyです。

使用方法は次のとおりです

require 'httparty'

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

response.code
# 200

response.body
# ...

HTTP gemを使用する利点:

  • 使いやすいです。
  • 個別のget_responseはありません メソッド、get すでに応答オブジェクトを提供しています。
  • 次のセクションで説明するように、SSLリクエストは透過的になります

SSLリクエストの送信

net / httpでSSLリクエストを送信しようとした場合 :

Net::HTTP.get_response("example.com", "/", 443)

取得:

Errno::ECONNRESET: Connection reset by peer

代わりにこれを行う必要があります:

net = Net::HTTP.new("example.com", 443)

net.use_ssl = true
net.get_response("/")

作業を節約して宝石を使用してください🙂

POSTリクエストでデータを送信する方法

GETリクエストは、情報をリクエストするために使用されます 。

画像、css、javascriptをダウンロードするように…

ただし、情報を送信する場合はPOSTリクエストを使用してください

次に例を示します:

HTTParty.post("https://example.com/login", body: { user: "test@example.com", password: "chunky_bacon" })

ファイルをアップロードするには、マルチパートリクエストが必要です 、HTTPartyではサポートされていません。

残りのクライアントgemを使用できます:

require 'rest-client'

RestClient.post '/profile', file: File.new('photo.jpg', 'rb')

またはファラデーの宝石:

require 'faraday'

conn =
Faraday.new do |f|
  f.request :multipart
  f.request :url_encoded

  f.adapter :net_http
end

file_io = Faraday::UploadIO.new('photo.jpg', 'image/jpeg')

conn.post('https://example.com/profile', file: file_io)

カスタムHTTPヘッダーを送信する方法

HTTPリクエストでカスタムヘッダーを送信できます。

これは、リクエストとともに追加のデータを送信するのに役立ちます 、含む:

  • クッキー
  • ユーザーエージェント
  • キャッシュ設定
  • コンテンツタイプ
  • 承諾(JSONを取り戻すなど)

方法は次のとおりです。

Faraday.new('https://example.com', headers: { 'User-Agent' => 'test' }).get

ファラデーオブジェクトを作成しています(newを使用) )、次にgetを呼び出します その上で。

または、このようなことを行うことができます

Faraday.post(
  "https://example.com/login/oauth/access_token",
  URI.encode_www_form(
    code: params[:code],
    client_id: ENV["example_client_id"],
    client_secret: ENV["example_client_secret"],
  ),
  {
    "Content-Type" => "application/x-www-form-urlencoded",
    "Accept" => "application/json"
  }
)

これは、OAuthタイプのリクエストに最適です。

最高のRubyHTTPクライアントの選択

Rubyで利用できるHTTPクライアントはたくさんあります。

しかし、どちらを選ぶべきですか?

この決定を支援するために、比較表を用意しました。

こちら

REPO STARS RECENT_COMMIT_COUNT LAST_COMMIT LATEST_RELEASE CREATED_DATE
lostisland / faraday 4817 26 2020-07-09 09:43:09 2020-03-29 13:46:47 2009-12-10 17:14:55
rest-client / rest-client 4913 0 2019-08-25 21:41:17 2019-08-21 22:50:21 2009-12-07 19:34:29
typhoeus / typhoeus 3739 2 2020-05-17 19:33:54 2020-01-15 16:24:17 2009-02-18 23:14:50
jnunemaker / httparty 5220 11 2020-06-10 18:40:13 2020-06-10 18:40:13 2008-07-28 20:55:11
excon / excon 1018 14 2020-06-30 11:30:12 2020-06-17 12:07:02 2009-10-25 17:50:46
httprb / http 2623 13 2020-03-30 12:34:38 2020-02-26 17:33:37 2011-10-06 04:19:10

人気とこれらの宝石がどれだけよく維持されているかを調べることは、すべてのオプションを評価するための良い第一歩です。

しかし、それらの技術的な違いは何ですか?

これらの宝石の多くは、ネット/httpライブラリのラッパーです。 :

  • excon
  • httparty
  • 残りのクライアント

Faradayはアダプターの宝石ですが、さまざまな実装を使用できます。

そして、TyphoeusはClibcurlライブラリのラッパーです。

マルチスレッド用のTyphoeus

Typhoeusは、同時コードを記述せずに同時リクエストをサポートします。

これにより、1秒あたりのリクエスト数を最大化する場合は、Typhoeusが最適です。

マルチスレッドでTyphoeusを使用するには:

require 'typhoeus'

hydra   = Typhoeus::Hydra.hydra
request = Typhoeus::Request.new("https://www.rubyguides.com")

hydra.queue(request)
hydra.queue(request)

hydra.run

適応性のためのファラデージェム

Faradayを使用すると、net / httpからTyphoeus、さらにはrest-clientまですべて同じインターフェースからの実装を選択できます。 。

デフォルトはnet/httpですが、次のように変更できます:

Faraday.default_adapter = :typhoeus

ファラデーのもう1つの興味深い点は、ミドルウェアをサポートしていることです。

ミドルウェアは、特定の方法で要求または応答を変更するのに役立つプラグインのようなものです。

require 'faraday_middleware'

client =
  Faraday.new do |f|
    f.response :json
    f.adapter :net_http
  end

client.get('https://api.github.com/repos/vmg/redcarpet/issues')

このミドルウェアは、応答をJSONとして自動的に解析します。

解析する代わりにJSONを送信する場合は、f.request :jsonを使用します f.response :jsonの代わりに 。

ファラデービデオ

ボーナス:HTTPリクエストをデバッグする方法

コードが正しく機能していることを確認できるように、コードが送信している内容を正確に確認したい場合は…

…それでは、ちょっとしたコツがあります。

このワンライナーを使用できます:

ruby -rsocket -e "trap('SIGINT') { exit }; Socket.tcp_server_loop(8080) { |s,_| puts s.readpartial(1024); puts; s.puts 'HTTP/1.1 200'; s.close }

これにより、ポート8080にサーバーが作成され、受信したすべてのものが出力され、HTTPステータスコードが返され、接続が閉じられます。

localhost:8080に対してリクエストを送信できます それらを見るために。

このように

Faraday.new('https://localhost:8080', headers: { 'User-Agent' => 'test', 'foo' => '1234' }).get

# GET / HTTP/1.1
# User-Agent: test
# Foo: 1234
# Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
# Accept: */*
# Connection: close
# Host: localhost:8080
>

その他のオプションには、httplogなどのgemやmitmproxyなどのツールの使用が含まれます。

概要

基本的なGETで情報をリクエストするから始めて、あらゆる種類のHTTPリクエストを送信する方法を学びました。 、情報を送信するPOSTリクエスト

HTTPリクエストを処理するための最も人気のあるRubygemの概要を見てきました。私のお気に入りはfaradayです 柔軟性があるためですが、ニーズに合っている場合は、別の宝石を自由に選択してください。

この投稿を楽しんだら、友達と共有して、友達も楽しんでください🙂

読んでくれてありがとう!


  1. Ruby Enumerable Moduleの基本ガイド(+私のお気に入りの方法)

    列挙可能とは何ですか? 列挙可能は反復法のコレクションです 、Rubyモジュール、そしてRubyを優れたプログラミング言語にする大きな部分です。 列挙可能には次のような便利なメソッドが含まれます : マップ 選択 注入 列挙可能なメソッドは、ブロックを与えることで機能します。 そのブロックで、すべての要素で何をしたいのかを伝えます。 例 : [1,2,3].map { |n| n * 2 } すべての数値が2倍になった新しい配列を提供します。 正確に何が起こるかは、使用する方法、 mapによって異なります。 すべての値を変換するのに役立ちます、 select リス

  2. Mac上のAndroidメッセージの究極のガイド

    Mac 上の Android メッセージ ?不可能に聞こえますよね? 2 つのブランド間の競争が激しいため、ほとんどの人は Android と Mac は連携しないと考えています。ただし、Google は会話をユーザーにとって便利で柔軟なものにしたいと考えているため、Android Messages を開発しました。 このメッセージング プラットフォームは、PC デバイスと Mac デバイスの両方で使用できます。したがって、Mac コンピューターをお持ちの場合は、使用するのが難しくないので心配する必要はありません。 Android メッセージは複数のデバイスで互換性があるため、さまざま