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

HTTParty 보석 사용 방법

일을 더 쉽게 만들어 줄 보석이 ​​많이 있습니다.

이러한 보석 중 하나는 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("/")

작업을 절약하고 보석을 사용하십시오 🙂

게시 요청으로 데이터를 제출하는 방법

GET 요청은 정보를 요청하는 데 사용됩니다. .

이미지 다운로드, CSS, 자바스크립트 등…

그러나 정보를 제출하려면 POST 요청을 사용하세요. .

다음은 예입니다.

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

파일을 업로드하려면 멀티파트 요청이 필요합니다. , HTTPParty에서 지원하지 않습니다.

나머지 클라이언트 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 유형의 요청에 적합합니다.

최고의 Ruby HTTP 클라이언트 선택

Ruby에는 많은 HTTP 클라이언트가 있습니다.

하지만 어떤 것을 선택해야 할까요?

이러한 결정을 내리는 데 도움이 되도록 비교표를 준비했습니다.

여기 있습니다 :

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
휴식 클라이언트/휴식 클라이언트 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 라이브러리를 둘러싼 래퍼입니다. :

  • 엑스콘
  • 파티
  • 휴식 클라이언트

Faraday는 어댑터 젬이지만 다른 구현을 사용할 수 있습니다.

그리고 Typhoeus는 C libcurl 라이브러리의 래퍼입니다.

멀티 스레딩을 위한 장티푸스

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를 사용하면 net/http, Typhoeus 또는 rest-client까지 모두 동일한 인터페이스에서 구현을 선택할 수 있습니다. .

기본값은 net/http이지만 다음과 같이 변경할 수 있습니다.

Faraday.default_adapter = :typhoeus

Faraday의 또 다른 흥미로운 점은 미들웨어를 지원한다는 것입니다.

미들웨어는 특정 방식으로 요청이나 응답을 수정하는 데 도움이 되는 플러그인과 같습니다.

:

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 요청 작업에 가장 많이 사용되는 Ruby gem에 대한 개요를 보았습니다. 내가 가장 좋아하는 것은 faraday입니다. 유연성이 있기 때문에 필요에 따라 다른 보석을 선택하셔도 됩니다.

이 게시물이 마음에 드셨다면 친구들과 공유하여 그들도 즐길 수 있도록 해주세요 🙂

읽어주셔서 감사합니다!