웹사이트에서 정보를 얻고 싶거나 양식 제출, 파일 업로드 등을 원하시면
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: "[email protected]", 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
입니다. 유연성이 있기 때문에 필요에 따라 다른 보석을 선택하셔도 됩니다.
이 게시물이 마음에 드셨다면 친구들과 공유하여 그들도 즐길 수 있도록 해주세요 🙂
읽어주셔서 감사합니다!