Skip to content

Instantly share code, notes, and snippets.

@marshluca
Created April 5, 2011 12:32
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marshluca/903506 to your computer and use it in GitHub Desktop.
Save marshluca/903506 to your computer and use it in GitHub Desktop.
net/http
#!/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