Ruby on Rails kullanarak bir HTTP isteği nasıl yapılır?


235

Başka bir web sitesinden bilgi almak istiyorum. Bu nedenle (belki) bu web sitesine bir istekte bulunmalıyım (benim durumumda bir HTTP GET isteği) ve yanıtı almalıyım.

Bunu Ruby on Rails'de nasıl yapabilirim?

Mümkünse, denetleyicilerimde kullanmak doğru bir yaklaşım mıdır?

Yanıtlar:


329

Ruby Net::HTTPsınıfını kullanabilirsiniz :

require 'net/http'

url = URI.parse('http://www.example.com/index.html')
req = Net::HTTP::Get.new(url.to_s)
res = Net::HTTP.start(url.host, url.port) {|http|
  http.request(req)
}
puts res.body

1
burada 'req' ne anlama geliyor?
sixty4bit

18
bu talep anlamına gelir
Arthur Collé

1
Görünüşe göre bu engelleme isteği olabilir, değil mi?
Scott Eisenberg

api anahtarını nereye koyabilirim?
user1735921

1
Sadece www ekleyerek. gerekli olmamalı, genellikle değil.
JackHasaKeyboard

111

Net :: HTTP Ruby yerleşik ama hadi, genellikle daha kolay Şunu kabul değil onun hantal 1980'ler stili kullanan ve daha yüksek seviyeli bir alternatif denemek için:


4
Veya Rails ile gelen ActiveResource!
Marnen Laibow-Koser

8
Raylar uygulamanıza daha fazla bağımlılık ekleyeceğiniz için buna karşı dikkatli olmak istiyorum. Daha fazla bağımlılık, daha fazla bellek tüketimi ve potansiyel olarak daha büyük saldırı yüzeyi anlamına gelir. Kullanmak Net::HTTPkülfetli ama takas değmez.
Jason Yeo

3
Bu kabul edilen cevap olmalı. Neden sadece çok sayıda Gems yükleyebileceğiniz zaman programlayın?
omikes

5
@JasonYeo Kesinlikle katılmıyorum. Bağımlılıkları tanıtmak, tekerleği yeniden icat etmediğiniz anlamına gelir ve başkalarının zaten yaptığı zor işten faydalanırsınız. Hayatınızı kolaylaştıran bir mücevher varsa, genellikle kullanmamanız için iyi bir neden yoktur.
Marnen Laibow-Koser

1
@JasonYeo Sol taraftaki destan sadece NPM deposunu kötü çalıştırdığı ve yazarın tüm paketlerini silmesine izin verdiği için oldu. Düzgün yönetilen paket depoları bunu yapmaz (ve yine de OSS'dir, böylece isterseniz kolayca yansıtabilirsiniz). Yani, sol pad efsanesi genel olarak bağımlılıklar getirmeye karşı değil, repoyu kötü yönetmeye karşı bir argüman. Diğer noktanıza katılıyorum, ihtiyacınız olandan daha fazlasını yapan büyük bir bağımlılığın sağladığı değer için aşırıya kaçabilir.
Marnen Laibow-Koser


82
require 'net/http'
result = Net::HTTP.get(URI.parse('http://www.example.com/about.html'))
# or
result = Net::HTTP.get(URI.parse('http://www.example.com'), '/about.html')

13

Net :: HTTP yerine httpclient tercih ediyorum .

client = HTTPClient.new
puts client.get_content('http://www.example.com/index.html')

Bir hizmet için istemci olan bir sınıf oluşturuyorsanız, HTTParty iyi bir seçimdir. İhtiyacınız olanın% 90'ını sağlayan kullanışlı bir karışımdır. Google ve Twitter istemcilerinin örneklerde ne kadar kısa olduğunu görün .

Ve ikinci sorunuzu cevaplamak için: hayır, bu işlevselliği bir denetleyiciye koymazdım - Mümkünse (belki de HTTParty kullanarak) ayrıntıları kapsüllemek ve sadece denetleyiciden çağırmak için bir model kullanırdım.


URL'de parametreleri güvenli bir şekilde geçirmek nasıl mümkün olur? Örneğin: http: //www.example.com/index.html? Param1 = test1 & param2 = test2. Sonra diğer web sitesi parametrelerini okumak ve cevap hazırlamak gerekir. Fakat parametreleri nasıl okuyabilirim?
user502052

Ne demek istiyorsun, diğer web sitesinin parametrelerini okumalısın? Bu nasıl mümkün olabilir? Ne elde etmeye çalışıyorsunuz?
Marnen Laibow-Koser

8

URL'lerin içeriğini kapmak için sevdiğim iki yolu ya vardır openURI veya Ejderha .

OpenURI çünkü her yerde ve Typhoeus çünkü çok esnek ve güçlü.


8

Proxy arkasında bir REST api çağrısı yapıyorsanız çalışan kod:

require "uri"
require 'net/http'

proxy_host = '<proxy addr>'
proxy_port = '<proxy_port>'
proxy_user = '<username>'
proxy_pass = '<password>'

uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>")
proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass)

req = Net::HTTP::Get.new(uri.path)
req.basic_auth(<sauce_username>,<sauce_password>)

result = proxy.start(uri.host,uri.port) do |http|
http.request(req)
end

puts result.body
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.