ฉันต้องการรับข้อมูลจากเว็บไซต์อื่น ดังนั้น (อาจ) ฉันควรทำการร้องขอไปยังเว็บไซต์นั้น (ในกรณีของฉันคือคำขอ HTTP GET) และรับการตอบกลับ
ฉันจะสร้างมันใน Ruby on Rails ได้อย่างไร
ถ้าเป็นไปได้มันเป็นวิธีการที่ถูกต้องในการใช้งานในคอนโทรลเลอร์ของฉันหรือไม่?
ฉันต้องการรับข้อมูลจากเว็บไซต์อื่น ดังนั้น (อาจ) ฉันควรทำการร้องขอไปยังเว็บไซต์นั้น (ในกรณีของฉันคือคำขอ HTTP GET) และรับการตอบกลับ
ฉันจะสร้างมันใน Ruby on Rails ได้อย่างไร
ถ้าเป็นไปได้มันเป็นวิธีการที่ถูกต้องในการใช้งานในคอนโทรลเลอร์ของฉันหรือไม่?
คำตอบ:
คุณสามารถใช้Net::HTTPคลาสของรูบี้:
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
Net :: HTTP ถูกสร้างขึ้นใน Ruby แต่ลองดูกันบ่อยครั้งมันจะง่ายกว่าที่จะไม่ใช้สไตล์ที่ยุ่งยากในช่วงปี 1980 และลองทางเลือกในระดับที่สูงขึ้น:
Net::HTTPนั้นยุ่งยาก แต่การแลกเปลี่ยนไม่คุ้มค่า
OpenURI นั้นดีที่สุด มันง่ายเหมือน
require 'open-uri'
response = open('http://example.com').read
open-uriจะไม่ติดตามการเปลี่ยนเส้นทาง
file:///etc/passwd
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')
ฉันชอบhttpclientมากกว่า Net :: HTTP
client = HTTPClient.new
puts client.get_content('http://www.example.com/index.html')
HTTParty เป็นตัวเลือกที่ดีถ้าคุณสร้างคลาสที่เป็นไคลเอนต์สำหรับบริการ มันเป็นสูตรผสมที่สะดวกสบายที่ให้ 90% ของสิ่งที่คุณต้องการ ดูวิธีการระยะสั้นลูกค้า Google และทวิตเตอร์อยู่ในตัวอย่าง
และเพื่อตอบคำถามที่สองของคุณ: ไม่ฉันจะไม่ใส่ฟังก์ชั่นนี้ในคอนโทรลเลอร์ - ฉันจะใช้โมเดลแทนถ้าเป็นไปได้ที่จะสรุปรายละเอียด (อาจใช้ HTTParty) และเรียกมันจากคอนโทรลเลอร์
โปรดของฉันสองวิธีที่จะคว้าเนื้อหาของ URL ที่มีทั้งOpenURIหรือTyphoeus
OpenURI เพราะมันอยู่ทุกหนทุกแห่งและ Typhoeus เพราะมันยืดหยุ่นและทรงพลังมาก
นี่คือรหัสที่ใช้งานได้หากคุณทำการเรียกใช้ REST api หลังพร็อกซี:
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