หากคุณต้องการรับข้อมูลจากเว็บไซต์ หรือหากต้องการส่งแบบฟอร์ม อัปโหลดไฟล์ ฯลฯ
คุณจะต้องส่งคำขอ 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: "[email protected]", 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
เนื่องจากมีความยืดหยุ่น แต่อย่าลังเลที่จะเลือกอัญมณีอื่นหากตรงกับความต้องการของคุณมากขึ้น
หากคุณชอบโพสต์นี้โปรดแชร์กับเพื่อน ๆ ของคุณเพื่อให้พวกเขาได้สนุกกับมันเช่นกัน 🙂
ขอบคุณสำหรับการอ่าน!