Created
April 5, 2011 12:32
-
-
Save marshluca/903506 to your computer and use it in GitHub Desktop.
net/http
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby -wKU | |
require "net/http" | |
require "uri" | |
####################### Standard HTTP Request ####################### | |
def standard_http_request | |
uri = URI.parse("http://wwwgoogle.com.hk") | |
# Shortcut | |
response = Net::HTTP.get_response(uri) | |
# Will print response.body | |
Net::HTTP.get_print(uri) | |
# Full | |
http = Net::HTTP.new(uri.host, uri.port) | |
response = http.request(Net::HTTP::Get.new(uri.request_uri)) | |
end | |
standard_http_request | |
####################### Basic Auth ####################### | |
def basic_auth | |
uri = URI.parse("http://google.com/") | |
http = Net::HTTP.new(uri.host, uri.port) | |
request = Net::HTTP::Get.new(uri.request_uri) | |
request.basic_auth("username", "password") | |
response = http.request(request) | |
end | |
####################### Dealing with response objects ####################### | |
def deal_with_response_objects | |
uri = URI.parse("http://google.com/") | |
http = Net::HTTP.new(uri.host, uri.port) | |
request = Net::HTTP::Get.new(uri.request_uri) | |
response = http.request(request) | |
response.code # => 301 | |
response.body # => The body (HTML, XML, blob, whatever) | |
# Headers are lowercased | |
response["cache-control"] # => public, max-age=2592000 | |
end | |
####################### POST form request ####################### | |
def post_form_request | |
uri = URI.parse("http://example.com/search") | |
# Shortcut | |
response = Net::HTTP.post_form(uri, {"q" => "My query", "per_page" => "50"}) | |
# Full control | |
http = Net::HTTP.new(uri.host, uri.port) | |
request = Net::HTTP::Post.new(uri.request_uri) | |
request.set_form_data({"q" => "My query", "per_page" => "50"}) | |
response = http.request(request) | |
end | |
####################### File upload - input type="file" style ####################### | |
# Token used to terminate the file in the post body. Make sure it is not | |
# present in the file you're uploading. | |
# def file_upload | |
# BOUNDARY = "AaB03x" | |
# | |
# uri = URI.parse("http://something.com/uploads") | |
# file = "/path/to/your/testfile.txt" | |
# | |
# post_body = [] | |
# post_body < < "--#{BOUNDARY}\r\n" | |
# post_body < < "Content-Disposition: form-data; name=\"datafile\"; filename=\"#{File.basename(file)}\"\r\n" | |
# post_body < < "Content-Type: text/plain\r\n" | |
# post_body < < "\r\n" | |
# post_body < < File.read(file) | |
# post_body < < "\r\n--#{BOUNDARY}--\r\n" | |
# | |
# http = Net::HTTP.new(uri.host, uri.port) | |
# request = Net::HTTP::Post.new(uri.request_uri) | |
# request.body = post_body.join | |
# request["Content-Type"] = "multipart/form-data, boundary=#{BOUNDARY}" | |
# | |
# http.request(request) | |
# end | |
####################### SSL/HTTPS request ####################### | |
# Update: There are some good reasons why this code example is bad. | |
# It introduces a potential security vulnerability if it's essential you use the server certificate to verify the identity of the server you're connecting to. | |
# There's a fix for the issue though! | |
def ssl_request | |
uri = URI.parse("https://secure.com/") | |
http = Net::HTTP.new(uri.host, uri.port) | |
http.use_ssl = true | |
http.verify_mode = OpenSSL::SSL::VERIFY_NONE | |
request = Net::HTTP::Get.new(uri.request_uri) | |
response = http.request(request) | |
response.body | |
response.status | |
response["header-here"] # All headers are lowercase | |
end | |
####################### SSL/HTTPS request with PEM certificate ####################### | |
def pem_request | |
uri = URI.parse("https://secure.com/") | |
pem = File.read("/path/to/my.pem") | |
http = Net::HTTP.new(uri.host, uri.port) | |
http.use_ssl = true | |
http.cert = OpenSSL::X509::Certificate.new(pem) | |
http.key = OpenSSL::PKey::RSA.new(pem) | |
http.verify_mode = OpenSSL::SSL::VERIFY_PEER | |
request = Net::HTTP::Get.new(uri.request_uri) | |
end | |
####################### REST methods ####################### | |
# Basic REST. | |
# Most REST APIs will set semantic values in response.body and response.code. | |
def rest_request | |
http = Net::HTTP.new("api.restsite.com") | |
request = Net::HTTP::Post.new("/users") | |
request.set_form_data({"users[login]" => "quentin"}) | |
response = http.request(request) | |
# Use nokogiri, hpricot, etc to parse response.body. | |
request = Net::HTTP::Get.new("/users/1") | |
response = http.request(request) | |
# As with POST, the data is in response.body. | |
request = Net::HTTP::Put.new("/users/1") | |
request.set_form_data({"users[login]" => "changed"}) | |
response = http.request(request) | |
request = Net::HTTP::Delete.new("/users/1") | |
response = http.request(request) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment