Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

คู่มือขั้นสูงสำหรับคำขอ HTTP ใน Ruby

หากคุณต้องการรับข้อมูลจากเว็บไซต์ หรือหากต้องการส่งแบบฟอร์ม อัปโหลดไฟล์ ฯลฯ

คุณจะต้องส่งคำขอ HTTP แล้วดำเนินการตอบกลับ

ในบทความนี้ คุณจะได้เรียนรู้วิธี :

  • สร้างคำขอ HTTP อย่างง่ายโดยใช้ net/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

วิธีใช้ HTTParty Gem

มีอัญมณีมากมายที่ช่วยให้คุณทำสิ่งต่างๆ ได้ง่ายขึ้น

หนึ่งในอัญมณีเหล่านี้คือ httparty

วิธีใช้งาน :

require 'httparty'

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

response.code
# 200

response.body
# ...

ประโยชน์ของการใช้ HTTP gem:

  • ใช้งานง่ายขึ้น
  • ไม่มี get_response แยกจากกัน เมธอด get ให้วัตถุตอบกลับแล้ว
  • ดังที่คุณเห็นในหัวข้อถัดไป คำขอ SSL นั้นโปร่งใส

การส่งคำขอ SSL

หากคุณพยายามส่งคำขอ SSL ด้วย net/http :

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("/")

ช่วยตัวเองทำงานและใช้อัญมณี🙂

วิธีการส่งข้อมูลด้วยคำขอโพสต์

คำขอ GET ใช้เพื่อขอข้อมูล .

เช่นเดียวกับการดาวน์โหลดรูปภาพ, css, javascript…

แต่ถ้าคุณต้องการส่งข้อมูลให้ใช้คำขอ POST .

นี่คือตัวอย่าง:

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

ในการอัปโหลดไฟล์ คุณจะต้องมีคำขอหลายส่วน ซึ่งไม่รองรับโดย HTTParty

คุณสามารถใช้อัญมณีลูกค้าส่วนที่เหลือได้:

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

การเลือกไคลเอนต์ Ruby HTTP ที่ดีที่สุด

มีไคลเอนต์ HTTP มากมายใน Ruby

แต่คุณควรเลือกอันไหน?

เพื่อช่วยให้คุณตัดสินใจได้ เราได้เตรียมตารางเปรียบเทียบไว้ให้คุณ

นี่เลย :

REPO STARS RECENT_COMMIT_COUNT LAST_COMMIT LATEST_RELEASE CREATED_DATE
ลอสทิสแลนด์/ฟาราเดย์ 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
ไทฟอยด์/ไทฟอยด์ 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

การดูความนิยมและการดูแลรักษาอัญมณีเหล่านี้เป็นก้าวแรกที่ดีในการประเมินตัวเลือกทั้งหมด

แต่ความแตกต่างทางเทคนิคระหว่างพวกเขาคืออะไร?

อัญมณีเหล่านี้จำนวนมากเป็น ตัวห่อหุ้มรอบๆ ไลบรารี net/http :

  • excon
  • httparty
  • ลูกค้าพัก

แม้ว่าฟาราเดย์จะเป็นอแดปเตอร์เจม แต่ก็ใช้งานได้หลากหลาย

และ Typhoeus เป็นตัวห่อหุ้มรอบไลบรารี C libcurl

Typhoeus สำหรับ Multi-Threading

Typhoeus รองรับคำขอพร้อมกันโดยไม่ต้องเขียนโค้ดใดๆ พร้อมกัน

สิ่งนี้ทำให้ 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 Gem สำหรับการปรับตัว

Faraday ให้คุณเลือกการใช้งานใดก็ได้ตั้งแต่ net/http ถึง Typhoeus หรือแม้แต่ rest-client ทั้งหมดจากอินเทอร์เฟซเดียวกัน .

มีค่าเริ่มต้นเป็น net/http แต่คุณสามารถเปลี่ยนได้ดังนี้:

Faraday.default_adapter = :typhoeus

สิ่งที่น่าสนใจอีกอย่างเกี่ยวกับฟาราเดย์ก็คือมันรองรับมิดเดิลแวร์

มิดเดิลแวร์เป็นเหมือนปลั๊กอินที่ช่วยให้คุณแก้ไขคำขอหรือการตอบสนองในลักษณะเฉพาะ

ตัวอย่าง :

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

ตัวเลือกอื่นๆ ได้แก่ การใช้ gem เช่น httplog หรือเครื่องมือ เช่น mitmproxy

สรุป

คุณเรียนรู้วิธีส่งคำขอ HTTP ทุกประเภทโดยเริ่มจาก GET เพื่อขอข้อมูล basic ไปยัง คำขอ POST เพื่อส่งข้อมูล .

คุณได้เห็นภาพรวมของ Ruby gem ยอดนิยมสำหรับการทำงานกับคำขอ HTTP แล้ว สิ่งที่ฉันชอบคือ faraday เนื่องจากมีความยืดหยุ่น แต่อย่าลังเลที่จะเลือกอัญมณีอื่นหากตรงกับความต้องการของคุณมากขึ้น

หากคุณชอบโพสต์นี้โปรดแชร์กับเพื่อน ๆ ของคุณเพื่อให้พวกเขาได้สนุกกับมันเช่นกัน 🙂

ขอบคุณสำหรับการอ่าน!