Computer >> Máy Tính >  >> Lập trình >> Ruby

Hướng dẫn cơ bản về yêu cầu HTTP trong Ruby

Nếu bạn muốn lấy thông tin từ một trang web hoặc nếu bạn muốn gửi biểu mẫu, tải tệp lên, v.v.

Bạn sẽ cần gửi một yêu cầu HTTP và sau đó xử lý phản hồi.

Trong bài viết này, bạn sẽ tìm hiểu cách thực hiện :

  • Thực hiện một yêu cầu HTTP đơn giản bằng net / http
  • Gửi yêu cầu SSL
  • Gửi dữ liệu bằng cách sử dụng yêu cầu ĐĂNG
  • Gửi các tiêu đề tùy chỉnh
  • Chọn ứng dụng HTTP tốt nhất cho tình huống của bạn

Hãy làm điều này!

Cách gửi một yêu cầu HTTP

Ruby đi kèm với một ứng dụng khách http được tích hợp sẵn, nó được gọi là net / http và bạn có thể sử dụng nó để gửi bất kỳ loại yêu cầu nào bạn cần.

Đây là ví dụ về net / http :

require 'net/http'

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

Thao tác này sẽ trả về một chuỗi có nội dung HTML của trang.

Nhưng thường thì bạn muốn nhiều hơn nội dung HTML.

Giống như trạng thái phản hồi HTTP .

Nếu không có trạng thái phản hồi, bạn không biết yêu cầu của mình có thành công hay không.

Đây là cách bạn có được điều đó :

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

response.code
# 200

Bây giờ, nếu bạn muốn nội dung phản hồi, bạn gọi body phương pháp:

response.body

Cách sử dụng HTTParty Gem

Có rất nhiều loại đá quý có thể giúp bạn làm mọi thứ dễ dàng hơn.

Một trong những viên ngọc này là httparty.

Đây là cách sử dụng nó :

require 'httparty'

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

response.code
# 200

response.body
# ...

Các lợi ích của việc sử dụng đá quý HTTP:

  • Nó dễ sử dụng hơn.
  • Không có get_response riêng biệt phương thức, get đã cung cấp cho bạn một đối tượng phản hồi.
  • Như bạn sẽ thấy trong phần tiếp theo, họ công khai yêu cầu SSL

Gửi yêu cầu SSL

Nếu bạn cố gắng gửi yêu cầu SSL bằng net / http :

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

Bạn nhận được:

Errno::ECONNRESET: Connection reset by peer

Thay vào đó, bạn phải làm điều này:

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

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

Tiết kiệm cho mình một số công việc và sử dụng một viên ngọc quý 🙂

Cách gửi dữ liệu bằng yêu cầu đăng

Yêu cầu GET được sử dụng để yêu cầu thông tin .

Như tải xuống hình ảnh, css, javascript…

Nhưng nếu bạn muốn gửi thông tin, hãy sử dụng yêu cầu ĐĂNG .

Đây là một ví dụ:

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

Để tải tệp lên, bạn sẽ cần yêu cầu nhiều phần , không được HTTParty hỗ trợ.

Bạn có thể sử dụng gem của ứng dụng khách còn lại:

require 'rest-client'

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

Hoặc viên ngọc Faraday:

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)

Cách gửi tiêu đề HTTP tùy chỉnh

Bạn có thể gửi các tiêu đề tùy chỉnh với một yêu cầu HTTP.

Điều này giúp bạn gửi thêm dữ liệu theo yêu cầu của bạn , bao gồm:

  • Cookie
  • Tác nhân người dùng
  • Tùy chọn lưu vào bộ nhớ đệm
  • Loại nội dung
  • Chấp nhận (để lấy lại JSON hoặc thứ gì đó khác)

Đây là cách thực hiện:

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

Tôi đang tạo một đối tượng Faraday (sử dụng new ), sau đó gọi get trên đó.

Hoặc bạn có thể làm điều gì đó như thế này :

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"
  }
)

Điều này hoạt động hiệu quả đối với loại yêu cầu OAuth.

Chọn ứng dụng khách Ruby HTTP tốt nhất

Có rất nhiều ứng dụng khách HTTP có sẵn trong Ruby.

Nhưng bạn nên chọn cái nào?

Để giúp bạn đưa ra quyết định này, tôi đã chuẩn bị một bảng so sánh cho bạn.

Đây rồi :

REPO SAO 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

Xem xét mức độ phổ biến và mức độ duy trì tốt của những viên ngọc này là bước đầu tiên tốt để đánh giá tất cả các tùy chọn.

Nhưng sự khác biệt về kỹ thuật giữa chúng là gì?

Nhiều trong số những viên ngọc này là trình bao bọc xung quanh thư viện net / http :

  • excon
  • httparty
  • khách hàng còn lại

Mặc dù Faraday là một viên ngọc bộ điều hợp, nó có thể sử dụng các cách triển khai khác nhau.

Và Typhoeus là một trình bao bọc xung quanh thư viện C libcurl.

Typhoeus cho đa luồng

Typhoeus hỗ trợ các yêu cầu đồng thời mà không cần phải viết bất kỳ mã đồng thời nào.

Điều này làm cho Typhoeus trở thành lựa chọn tốt nhất nếu bạn đang muốn tối đa hóa yêu cầu của mình mỗi giây.

Để sử dụng Typhoeus với đa luồng:

require 'typhoeus'

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

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

hydra.run

Đá quý Faraday cho khả năng thích ứng

Faraday cho phép bạn chọn bất kỳ triển khai nào từ net / http, đến Typhoeus hoặc thậm chí là ứng dụng khách nghỉ ngơi tất cả từ cùng một giao diện .

Nó mặc định là net / http, nhưng bạn có thể thay đổi nó như thế này:

Faraday.default_adapter = :typhoeus

Một điều thú vị khác về Faraday là nó hỗ trợ phần mềm trung gian.

Phần mềm trung gian giống như một plugin giúp bạn sửa đổi yêu cầu hoặc phản hồi theo một cách cụ thể.

Ví dụ :

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')

Phần mềm trung gian này sẽ tự động phân tích cú pháp phản hồi dưới dạng JSON.

Nếu bạn muốn gửi JSON thay vì phân tích cú pháp, hãy sử dụng f.request :json thay vì f.response :json .

Video Faraday

Phần thưởng:Cách gỡ lỗi yêu cầu HTTP của bạn

Nếu bạn muốn biết chính xác mã của mình đang gửi để bạn có thể đảm bảo rằng mã đang hoạt động chính xác…

… Thì tôi có một mẹo nhỏ hay dành cho bạn.

Bạn có thể sử dụng một lớp lót này:

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 }

Điều này tạo ra một máy chủ trên cổng 8080 in mọi thứ mà nó nhận được, trả về mã trạng thái HTTP và sau đó đóng kết nối.

Bạn có thể gửi yêu cầu đối với localhost:8080 để xem chúng.

Như thế này :

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

Các tùy chọn khác bao gồm sử dụng đá quý như httplog hoặc một công cụ như mitmproxy.

Tóm tắt

Bạn đã học cách gửi tất cả các loại yêu cầu HTTP, bắt đầu từ thông tin cơ bản NHẬN để yêu cầu , đối với yêu cầu ĐĂNG để gửi thông tin .

Bạn đã thấy tổng quan về các viên ngọc Ruby phổ biến nhất để làm việc với các yêu cầu HTTP. Yêu thích của tôi là faraday vì tính linh hoạt mà nó mang lại, nhưng hãy chọn một viên ngọc khác nếu nó phù hợp với nhu cầu của bạn hơn.

Nếu bạn thích bài đăng này, hãy chia sẻ nó với bạn bè của bạn để họ cũng có thể thưởng thức nó 🙂

Cảm ơn vì đã đọc!