Arquivo

Textos com Etiquetas ‘Web Services’

Gem para cálculo de frete do PayPal Frete Fácil

4, setembro, 2011

O PayPal Frete Fácil é um serviço onde você tem desconto a partir de 30% no valor do frete, em relação ao valor de balcão do SEDEX dos Correios, para vendas feitas pelo PayPal.

PayPal Frete Facil

Você escolhe a transação de venda feita pelo PayPal, paga o frete pelo site, imprime a etiqueta que deve ser colada no pacote das mercadorias e posta em uma agência dos Correios conveniada.

O PayPal disponibiliza um Web Service para fazer o cálculo do PayPal Frete Fácil nos carrinhos de compra de lojas virtuais. Criei a gem paypal-frete-facil que consome esse Web Service.

Abaixo estão todos os detalhes de como instalar e utilizar a gem paypal-frete-facil.

Instalando

Gemfile:
gem 'paypal-frete-facil'

Instalação direta:
$ gem install paypal-frete-facil

Usando

require 'paypal-frete-facil'

frete = PayPal::FreteFacil::Frete.new :cep_origem => "04094-050",
                                       :cep_destino => "90619-900",
                                       :largura => 15,
                                       :altura => 2,
                                       :profundidade => 30,
                                       :peso => 0.3

frete.calcular  # => 13.87
frete.calculate # => 13.87

Log

Por padrão, cada chamada ao Web Service do PayPal Frete Fácil é logada em STDOUT, com nível de log :info, usando a gem LogMe.

Exemplo de log:
I, [2011-08-29T22:00:52.624430 #2186] INFO — : PayPal-Frete-Facil Request:
https://ff.paypal-brasil.com.br/FretesPayPalWS/WSFretesPayPal
<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:frete=”https://ff.paypal-brasil.com.br/FretesPayPalWS”><soapenv:Header /><soapenv:Body><frete:getPreco><cepOrigem>04094-050</cepOrigem><cepDestino>90619-900</cepDestino><largura>15</largura><altura>2</altura><profundidade>30</profundidade><peso>0.3</peso></frete:getPreco></soapenv:Body></soapenv:Envelope>

I, [2011-08-29T22:00:53.917895 #2186] INFO — : PayPal-Frete-Facil Response:
HTTP/1.1 200 OK
<?xml version=’1.0′ encoding=’UTF-8′?><S:Envelope xmlns:S=”http://schemas.xmlsoap.org/soap/envelope/”><S:Body><ns2:getPrecoResponse xmlns:ns2=”https://ff.paypal-brasil.com.br/FretesPayPalWS”><return>13.873999999999999</return></ns2:getPrecoResponse></S:Body></S:Envelope>

Se você configurar o nível de log como :debug, serão logados também todos os cabeçalhos HTTP da requisição e da resposta:
D, [2011-08-29T22:00:52.624430 #2186] DEBUG — : PayPal-Frete-Facil Request:
https://ff.paypal-brasil.com.br/FretesPayPalWS/WSFretesPayPal
accept: */*
user-agent: Ruby
content-type: text/xml; charset=utf-8
soapaction: https://ff.paypal-brasil.com.br/FretesPayPalWS/WSFretesPayPal/getPreco
<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:frete=”https://ff.paypal-brasil.com.br/FretesPayPalWS”><soapenv:Header /><soapenv:Body><frete:getPreco><cepOrigem>04094-050</cepOrigem><cepDestino>90619-900</cepDestino><largura>15</largura><altura>2</altura><profundidade>30</profundidade><peso>0.3</peso></frete:getPreco></soapenv:Body></soapenv:Envelope>

D, [2011-08-29T22:00:53.917895 #2186] DEBUG — : PayPal-Frete-Facil Response:
HTTP/1.1 200 OK
date: Tue, 30 Aug 2011 01:00:52 GMT
server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 mod_jk/1.2.30
content-length: 271
content-type: text/xml;charset=utf-8
set-cookie: ROUTEID=.2; path=/
connection: close
<?xml version=’1.0′ encoding=’UTF-8′?><S:Envelope xmlns:S=”http://schemas.xmlsoap.org/soap/envelope/”><S:Body><ns2:getPrecoResponse xmlns:ns2=”https://ff.paypal-brasil.com.br/FretesPayPalWS”><return>13.873999999999999</return></ns2:getPrecoResponse></S:Body></S:Envelope>

Para desabilitar o log, mudar o nível do log ou configurar um outro mecanismo de log, use o módulo PayPal::FreteFacil.

PayPal::FreteFacil.configure do |config|
  config.log_enabled = false   # Desabilita o log
  config.log_level = :debug     # Altera o nível do log
  config.logger = Rails.logger  # Usa o logger do Rails
end

Informações adicionais

Maneiras de configurar atributos no construtor de PayPal::FreteFacil::Frete

Com um hash:

frete = PayPal::FreteFacil::Frete.new :cep_origem => "04094-050",
                                       :cep_destino => "90619-900",
                                       :largura => 15,
                                       :altura => 2,
                                       :profundidade => 30,
                                       :peso => 0.3

Com um bloco:

frete = PayPal::FreteFacil::Frete.new do |f|
  f.cep_origem = "04094-050"
  f.cep_destino = "90619-900"
  f.largura = 15
  f.altura = 2
  f.profundidade = 30
  f.peso = 0.3
end
Atributos de PayPal::FreteFacil::Frete
  • String: cep_origem, cep_destino
  • Fixnum: largura, altura, profundidade
  • Float: peso
Código no Github

https://github.com/prodis/paypal-frete-facil

Gem no RubyGems.org

https://rubygems.org/gems/paypal-frete-facil

Ruby , , , , , , , , ,

Gem para cálculo de frete dos Correios

3, julho, 2011

O post da gem correios-frete foi movida para a seguinte página:

http://prodis.blog.br/correios-frete-gem-para-calculo-de-frete-dos-correios

Você será redirecionado para a nova página em 5 segundos.

Ruby , , , , , , , , , , ,

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive.

21, junho, 2010

Na semana passada estávamos mexendo em uma aplicação desenvolvida em .NET 2.0. O objetivo era incluir uma nova funcionalidade que dependia de um Web Service SOAP de terceiros.

Para fazer a nova implementação o mais rápido possível, utilizamos o recurso “Add Web Reference…” do Visual Studio 2005 para criar um proxy para o Web Service que queríamos consumir.

Fazendo isso, o Visual Studio 2005 gera algumas classes no arquivo Reference.cs (para visualizá-lo é preciso estar com a opção “Show all files” habilitada na janela Solution Explorer).

A partir dessas classes você pode fazer a comunicação com o Web Service através de simples chamadas de métodos.

CalcPrecoPrazoWS proxy = new CalcPrecoPrazoWS();
Resultado resultado = proxy.Calcular("03478010", "13500313", "0,456");

O problema

Até aqui tudo certo, mas quando testamos a aplicação fazendo a chamada do Web Service, aconteceu o seguinte erro:

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive.
at System.Web.Services.Protocols.WebClientProtocol.Ge tWebResponse(WebRequest request)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)

Depois de pesquisarmos um pouco, descobrimos que as possíveis causas desse problema são:

  • Quando o servidor do Web Service inesperadamente fecha a conexão
  • O time out do servidor do Web Service é muito baixo
  • O servidor do Web Service “reseta” a conexão inesperadamente, algo como uma exceção não tratada

A solução

Quando você chama um método da classe proxy, no exemplo acima a classe CalcPrecoPrazoWS, internamente a classe SoapHttpClientProtocol, que é a classe base do nosso proxy, aciona seu método protegido GetWebRequest, que irá fazer um requisição Web através da classe WebRequest.

Para não mantermos a “conexão viva” na requisição Web, sobrescrevemos o método GetWebRequest da classe SoapHttpClientProtocol, convertendo um objeto WebRequest em um objeto HttpWebRequest e configurando a propriedade KeepAlive para false antes de acionar a requisição.

protected override WebRequest GetWebRequest(Uri uri)
{
    HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    webRequest.ProtocolVersion = HttpVersion.Version10;

    return webRequest;
}

Isso pode ser feito no próprio arquivo Reference.cs, dentro da classe proxy que foi gerada pelo Visual Studio 2005. Mas qualquer alteração na referência Web, o Visual Studio 2005 irá gerar novamente o código do arquivo Reference.cs e seu código será apagado.

Então a melhor maneira de fazer isso é utilizar os recursos de classes parciais do .NET e separar seu código em um arquivo separado, como mostrado no exemplo abaixo:

public partial class CalcPrecoPrazoWS
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);
        webRequest.KeepAlive = false;
        webRequest.ProtocolVersion = HttpVersion.Version10;

        return webRequest;
    }
}

Mas não é só isso

Há também um série de outras causas para esse problema, bem como outras possíveis soluções, inclusive quando você está usando WCF no .NET 3.5.

A solução que apresentei funcionou no meu caso. Se ela não resolver seu problema, vale a pena investigar nesse artigo do suporte da Microsoft que lista possíveis causas e soluções:

You receive one or more error messages when you try to make an HTTP request in an application that is built on the .NET Framework 1.1 Service Pack 1
http://support.microsoft.com/kb/915599

Esse artigo é um tanto confuso e mal organizado, mas já é um bom começo.

.NET , , , , , ,

Jim Webber faz consultoria na Locaweb

5, maio, 2010

Jim Webber possui uma vasta experiência em arquitetura e desenvolvimento de Web Services. Atualmente está trabalhando na ThoughtWorks de Londres e finalizando seu novo livro REST in Practice: Hypermedia and Systems Architecture, que tem previsão de publicação para setembro desse ano.

Durante toda essa semana, ele está na Locaweb prestando consultoria para as equipes de tecnologia da empresa.

Eu e Jim Webber na Locaweb

Ontem foi a vez da equipe de SaaS, a qual eu faço parte. Mostramos a ele nossos sistemas, arquiteturas, tecnologias, formas de trabalho, desafios, etc. Também falamos dos nossos problemas atuais e, é claro, fizemos um monte de perguntas.

O Jim nos ajudou com algumas dúvidas e nos propos vários soluções e caminhos que podem ser tomados. Ele é um cara bastante extrovertido e simpático. Passamos o dia todo conversando e foi uma experiência muito boa para toda a equipe.

Eu particularmente tive um desafio pessoal, pois apresentei ao Jim o atual projeto de Comércio Eletrônico que estamos desenvolvendo. Foi minha primeira apresentação em inglês e logo para um renomado expectador. Bom, pelo feedback dos meus companheiros de equipe, e do próprio Jim, tudo ocorreu bem.

Arquitetura, Ruby, TDD , , , , , , , , ,