Net::HTTP is not as tough as it appears

Finally got some time for a new post after a long year gap.

Many of us(Ruby Developers) ignore the Ruby Net::HTTP library when we want to communicate with other external applications from our own app. We mostly tend to use certain gems:

and others… but why not use the a native library which is already packaged and delivered with ruby. There is only one advantage of using the external libraries, it makes your code look shorter, and you are happy with it, ARE YOU?? But wait!!! Think about it. You have included an extra library with a bunch of files in your project, which effects the load time of your application.

So here’s what I did to escape from the usage of external libraries and implement the required functionality in my own way.

require "net/http"
require "active_support"

class HTTPRequest
 def self.send_get_request(request_domain,path,data,headers=nil)
 uri = URI.parse(request_domain)
 http = Net::HTTP.new(uri.host, uri.port)

 if headers == nil
 response = http.send_request('GET',path,data)
 else
 response = http.send_request('GET',path,data,headers)
 end

 response.body
 end

def self.send_post_request(request_domain,path,data,headers=nil)
 uri = URI.parse(request_domain)
 http = Net::HTTP.new(uri.host, uri.port)

 if headers == nil
 response = http.send_request('POST',path,data)
 else
 response = http.send_request('POST',path,data,headers)
 end

 response.body
 end

def self.send_put_request(request_domain,path,data,headers=nil)
 uri = URI.parse(request_domain)
 http = Net::HTTP.new(uri.host, uri.port)

 if headers == nil
 response = http.send_request('PUT',path,data)
 else
 response = http.send_request('PUT',path,data,headers)
 end

 response.body
 end

def self.send_delete_request(request_domain,path,data,headers=nil)
 uri = URI.parse(request_domain)
 http = Net::HTTP.new(uri.host, uri.port)

 if headers == nil
 response = http.send_request('DELETE',path,data)
 else
 response = http.send_request('DELETE',path,data,headers)
 end

 response.body
 end

def self.send_request(domain, request_type, request_path, data={}, headers={})
 request_path = "/#{request_path}" unless request_path[0] == "/"
 data = data.to_query if data.is_a?(Hash)
 response = {}
 if request_type == "GET"
 response = send_get_request(domain, request_path, data, headers)
 elsif request_type == "POST"
 response = send_post_request(domain, request_path, data, headers)
 elsif request_type == "PUT"
 response = send_put_request(domain, request_path, data, headers)
 elsif request_type == "DELETE"
 response = send_delete_request(domain, request_path, data, headers)
 end

 ActiveSupport::JSON.decode(response)
 end
end

This code helps me a lot, and lets me have a better control over it, which is not possible in the case of external libraries. Hope this piece of code will be helpful to you guys as well.

UPDATE:

I have created a gem using this, you can install it using the command:

gem install http-requestor

The documentation is available at https://github.com/rohit9889/http-requestor

About these ads

One comment to Net::HTTP is not as tough as it appears

  1. NjeriChelimo says:

    This is unbelievably awesome!! :) Thanks!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s