Postagens HTTP em Ruby

Às vezes, preciso fazer postagens HTTP simples em um script Ruby. Usar uma biblioteca de terceiros pode ser muito complicado para um script tão simples.

Esse post ajuda muito, mas não cobre todas as minhas necessidades. Especificamente, ao trabalhar com a API Switchvox , espera-se que os métodos da API sejam um parâmetro JSON.

Vamos começar implicando na postagem de alguns JSON.

Poste algum JSON

require 'net/http'
require 'uri'
require 'json'

uri
= URI.parse("http://localhost:3000/users")

header
= {'Content-Type': 'text/json'}
user
= {user: {
name
: 'Bob',
email
: 'bob@example.com'
}
}

# Create the HTTP objects
http
= Net::HTTP.new(uri.host, uri.port)
request
= Net::HTTP::Post.new(uri.request_uri, header)
request
.body = user.to_json

# Send the request
response
= http.request(request)

Isso simplesmente enviará uma solicitação POST com o JSON como corpo.

Mas, havia alguns métodos que exigiam que um arquivo fosse enviado com o JSON? As coisas ficam um pouco mais complicadas quando você faz isso, mas ainda é administrável.

Poste um arquivo com algum JSON

require 'net/http'
require 'uri'
require 'json'
require 'mime/types'

uri
= URI.parse("http://localhost:3000/users")
BOUNDARY
= "AaB03x"

header
= {"Content-Type": "multipart/form-data, boundary=#{BOUNDARY}"}
user
= {user: {
name
: 'Bob',
email
: 'bob@example.com'
}
}
file
= "test_file.xml"

# We're going to compile all the parts of the body into an array, then join them into one single string
# This method reads the given file into memory all at once, thus it might not work well for large files
post_body
= []

# Add the file Data
post_body
<< "--#{BOUNDARY}rn"
post_body
<< "Content-Disposition: form-data; name="user[][image]""; filename=""#{File.bsename(file)}""rn""
post_body
<< ""Content-Type: #{MIME::Types.type_for(file)}rnrn""
post_body
<< File.read(file)

# Add the JSON
post_body
<< ""--#{BOUNDARY}rn""
post_body
<< ""Content-Disposition: form-data; name=""user[]""rnrn""
post_body
<< user.to_json
post_body
<< ""rnrn--#{BOUNDARY}--rn""

# Create the HTTP objects
http
= Net::HTTP.new(uri.host