Este projeto inclui uma estrutura modular para integrar com diferentes APIs de maneira eficiente e reutilizável. A seguir, detalhamos como essa estrutura foi implementada e como você pode utilizá-la para integrar com qualquer API.
A integração com APIs é gerenciada através de serviços Ruby, organizados da seguinte maneira:
- Classe Base (
BaseService): Contém a lógica comum para lidar com requisições HTTP, incluindo configuração de hosts, headers, e análise de respostas. - Classes Específicas: Cada classe específica herda da
BaseServicee implementa métodos para interagir com endpoints específicos da API.
Este projeto utiliza uma estrutura modular para integração com APIs, organizada em uma classe base (BaseService) que gerencia a lógica comum de requisições HTTP e classes específicas que herdam da classe base para interagir com endpoints específicos da API.
A classe BaseService é responsável por definir os métodos essenciais para a integração com APIs.
#### `initialize(token = nil)`
def initialize(token = nil)
@token = token || ENV['API_TOKEN']
end
Objetivo: Inicializa a classe com um token de autenticação. Se nenhum token for fornecido, ele utiliza um
token padrão definido na variável de ambiente API_TOKEN.host
def host
Rails.env.production? ? 'https://api.production.com/v1' : 'https://sandbox.api.com/v1'
end
Objetivo: Define a URL base da API. A URL muda de acordo com o ambiente (produção ou desenvolvimento/sandbox).perform_request(endpoint:, method: :get, payload: {}, headers: {})
def perform_request(endpoint:, method: :get, payload: {}, headers: {})
uri = URI.parse("#{host}#{endpoint}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
request = build_request(method, uri, headers)
request.body = payload.to_json unless payload.empty?
response = http.request(request)
parse_response(response)
end
. Objetivo: Método principal para realizar requisições HTTP.
. endpoint: O caminho na API para o qual a requisição será enviada.
. method: O método HTTP (GET, POST, PUT, DELETE).
. payload: Os dados que serão enviados no corpo da requisição.
. headers: Headers adicionais para a requisição.build_request(method, uri, headers)
def build_request(method, uri, headers)
request_class = case method
when :post then Net::HTTP::Post
when :put then Net::HTTP::Put
when :delete then Net::HTTP::Delete
else Net::HTTP::Get
end
request = request_class.new(uri)
request["Authorization"] = "Bearer #{@token}" if @token
request["Content-Type"] = "application/json"
headers.each { |key, value| request[key] = value }
request
end
. Objetivo: Cria a requisição HTTP apropriada com base no método especificado.
. Define o tipo de requisição HTTP (GET, POST, PUT, DELETE).
. Adiciona o token de autorização, se disponível.
. Configura os headers.parse_response(response)
def parse_response(response)
case response.code.to_i
when 200, 201
{ success: true, data: JSON.parse(response.body) }
else
{ success: false, error: response.message, details: response.body }
end
end
. Objetivo: Interpreta a resposta da API.
. Se o código de status for 200 ou 201, considera a resposta bem-sucedida e parseia os dados do JSON.
. Para outros códigos, retorna uma mensagem de erro junto com os detalhes.- UserService:
A classe UserService herda de BaseService e implementa métodos específicos para interagir com a API de usuários.
create_user(user_params)
def create_user(user_params)
perform_request(endpoint: '/users', method: :post, payload: user_params)
end
. Objetivo: Envia uma requisição POST para criar um novo usuário.update_user(user_id, user_params)
def update_user(user_id, user_params)
perform_request(endpoint: "/users/#{user_id}", method: :put, payload: user_params)
end
. Objetivo: Envia uma requisição PUT para atualizar os dados de um usuário existente.delete_user(user_id)
def delete_user(user_id)
perform_request(endpoint: "/users/#{user_id}", method: :delete)
end
. Objetivo: Envia uma requisição DELETE para remover um usuário específico.get_user(user_id)
def get_user(user_id)
perform_request(endpoint: "/users/#{user_id}")
end
. Objetivo: Envia uma requisição GET para buscar os dados de um usuário específico.Exemplo:
module ApiIntegration
class OrderService < BaseService
def create_order(order_params)
perform_request(endpoint: '/orders', method: :post, payload: order_params)
end
def get_order(order_id)
perform_request(endpoint: "/orders/#{order_id}")
end
end
endEste padrão de integração facilita o desenvolvimento de serviços para qualquer API, promovendo a reutilização de código e a manutenção simplificada. Siga esta estrutura ao adicionar novos endpoints ou ao integrar com APIs diferentes, garantindo consistência e eficiência no seu código.