Categorias
dicas php visual studio web-service wsdl

Consumindo Web-Service PHP atrav??s do ASP.NET (C#)

J?? passou por aqui um post sobre de como consumir um web-service, mas era em ASP.NET. Agora como consumir um web-service em PHP? Da mesma forma. N??o muda! O fato de escrever esse post ?? apenas e pelo simples fato de ter um certo inconveniente na elabora????o do web-service em PHP.
Se procurar na net, recomendo o artigo de Maur??cio Reckziegel da iMasters que ?? muito bom e explica certinho como fazer. Se voc?? seguir ?? risca o que est?? escrito ir?? conseguir elaborar um web-service em PHP normalmente e ir?? conseguir consumir, menos em ASP.NET. N??o ?? que a mat??ria esteja errada, ?? porque o ASP.NET ?? chato com a valida????o do WSDL que ?? gerado pelo PHP. O documento (WSDL) tem que ser gerado na m??o e, quando n??o ?? gerado de forma autom??tica, estamos suscept??veis ao erro. Com o web-service em PHP ?? assim…
Ent??o, digamos que voc?? tenha elaborado o web-service em PHP e j?? fez refer??ncia na sua aplica????o. Contudo sua aplica????o pode dar erro ou retornar nada. Primeiramente, todo WSDL que iremos usar deve ser validado antes de ser devidamente consumido. O Visual Studio disp??e de uma ferramenta que valida e gera a classe consumidora (que n??o precisar ser usada pois est?? intr??nseco na ferramenta). V?? em Iniciar > Todos os Programas > Microsoft Visual StudioVisual Studio ToolsVisual Studio 2008 Command Prompt. Ir?? abrir um prompt de comando. Escreva por exemplo: wsdl http://thiagomarcal.blogspot.com/webservice.php?wsdl . Se der tudo certo, ir?? surgir um resultado semelhante a esse:

Se estiver tudo OK, ent??o pode usar tranquilamente, caso contr??rio ir?? surgir o seguinte problema:

Microsoft (R) Web Services Description Language Utility

[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.

Warning: This web reference does not conform to WS-I Basic Profile v1.1.

Ou seja, o WSDL gerado pelo PHP n??o est?? conforme o padr??o. Dando uma alterada aqui e ali, podemos usar o seguinte c??digo para gerarmos o web-service em PHP dentro dos conformes:

<?php
// Requerimento aos componentes
require_once(‘nusoap/nusoap.php’);
include(“class.phpmailer.php”);
include(“class.smtp.php”);


// Cria????o da inst??ncia
$server = new soap_server();


// Registro do m??todo
$server->register(‘EnviaMail’);


// WSDL
$server->configureWSDL(‘server.EnviaMail’,’urn:server.EnviaMail’);
$server->wsdl->schemaTargetNamespace = ‘urn:server.EnviaMail’;
// registra o m??todo a ser oferecido
$server->register(‘EnviaMail’, //nome do m??todo
array(‘email’ => ‘xsd:string’), //par??metros de entrada
array(‘return’ => ‘xsd:string’), //par??metros de sa??da
‘urn:server.EnviaMail’, //namespace
‘urn:server.EnviaMail#EnviaMail’, //soapaction
‘rpc’, //style
‘literal’, //use
‘Retorna se o e-mail foi enviado’ //documenta????o do servi??o
);


// Defini????o do m??todo a ser utilizado
function EnviaMail($email) {
return “E-email enviado com sucesso!”;
}


// Requisi????o para uso do servi??o
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ;
$server->service($HTTP_RAW_POST_DATA);
?>

Perceberam a diferen??a? Praticamente nenhuma, mas h??: o estilo do documento. N??o irei entrar em detalhes, mas dois tipos de documentos mais usados: encoded e literal (veja mais nesse artigo). Use literal! Com isso seu web-service ser?? consumido certinho…
Se estiver com o erro: O cliente encontrou o tipo conte??do de resposta de ‘ text/html; charset = utf-8 ‘, mas era esperado ‘text/xml’ ou The client find the answer ‘text/html’, but was expected ‘text/xml’. verifique se seu web-service est?? imprimindo conte??do HTML (echo) e comprometendo o retorno dos dados. Tranquilo, n???

Categorias
correios dicas dll web-service

Acompanhar rastreamento de pedido dos Correios com C#

Mais um artigo para quem trabalha com loja virtual… Essa funcionalidade ?? bem importante para visualizar o rastreamento de um determinado pedido. Ao inv??s de mandar apenas o link com o c??digo para seu cliente, porque n??o enviar logo a tabela com os dados? Pois bem, ?? isso que iremos fazer! O c??digo ?? bem simples, r??pido e pode-se alterar para uma “infinidades” de formas afim de o colocar do jeito que deseja.

Abaixo temos um resumo do processo:

  1. Enviamos uma requisi????o GET com o n??mero do rastreamento;
  2. Obtemos os dados de retorno (p??gina completa);
  3. Capturamos apenas a tabela com os dados de rastreamento;
  4. Exibimos na tela.
Para capturar a apenas a tabela com os dados, pode-se fazer de v??rias formas (Express??o Regular, etc), mas preferi usar um componente que captura n??s de um documento HTML, o HtmlAgilityPack. Baixe ele e o coloque na refer??ncia de seu projeto (Bin). Agora ?? f??cil – utilize o c??digo abaixo:
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HtmlAgilityPack;

protected void Page_Load(object sender, EventArgs e)
    {

        // Aplica campos de par??metros
        string codigo = “ES659170465BR”;
        string parametros = “?P_COD_UNI=” + codigo + “&P_LINGUA=001&P_TIPO=001”;
        // Cria o objeto de requisi????o
        WebRequest requisicao = WebRequest.Create(“http://websro.correios.com.br/sro_bin/txect01$.QueryList” + parametros);
        // Realiza a requisi????o
        HttpWebResponse retorno = (HttpWebResponse)requisicao.GetResponse();
        // L?? o objeto e faz a atribui????o ?? vari??vel
        StreamReader stream = new StreamReader(retorno.GetResponseStream(), Encoding.GetEncoding(“ISO-8859-1”));
        string dados = stream.ReadToEnd();
        // Transforma em um documento HTML – HtmlAgilityPack
        HtmlDocument html = new HtmlDocument();
        html.LoadHtml(dados);
        // Captura apenas a tabela contendo os dados do envio
        HtmlNode tabela = html.DocumentNode.SelectSingleNode(“//table”);
        if (tabela != null)
        {
            // Nesse caso voc?? pode capturar as colunas e linhas e trabalhar conforme desejar
            // Apenas fiz o loop para remover a formata????o inicial da tabela
            string htmlTable = “<table>”;
            // Extrai as linhas da tabela
            foreach (HtmlNode linha in tabela.SelectNodes(“//tr”))
                htmlTable += “<tr>” + linha.InnerHtml + “</tr>”;
            htmlTable += “</table>”;
            // Exibe a tabela de rastreamento
            Response.Write(“O hor??rio n??o indica quando a situa????o ocorreu, mas sim quando os dados foram recebidos pelo sistema, exceto no caso do <b>SEDEX 10 e do SEDEX Hoje, </b>em que ele  representa o hor??rio real da entrega.<br><br>” + htmlTable);
        }
        else
            Response.Write(“O nosso sistema n??o possui dados sobre o objeto informado. Se o objeto foi postado recentemente, ?? natural que seus rastros n??o tenham ingressado no sistema, nesse caso, por favor, tente novamente mais tarde. Adicionalmente, verifique se o c??digo digitado est?? correto: “ + codigo);
        // Finaliza objetos
        stream.Close();
        retorno.Close();

    }
No caso peguei o HTML da tabela contendo os dados e exibi de vez na tela. Poderia trat??-la de v??rias formas e uma delas poderia ser transformando-a em um DataTable ou DataSet para alguma manipula????o posterior. Veja nesse link aqui como fazer isso.
Os Correios n??o disp??e de Web-Service para esse tipo de consulta. Olhando na net, encontrei dois artigos: um de Manoel Campos e outro de Carlos Ferrari onde ambos disp??e de Web-Services (em PHP – mas pode ser consumido pelo ASP.NET) para esse tipo de consulta. Quem n??o quiser implementar e apenas consumir, podem us??-los que chega o mesmo objetivo.
Artigo bem f??cil e r??pido! Espero ter ajudado…
Categorias
cep correios frete web-service

Calculando frete com Web-Service dos Correios

Muito utilizado, principalmente, em lojas virtuais, o c??lculo de frete ?? uma funcionalidade bastante importante para todo e qualquer sistema. Nesse artigo veremos como usufruir do Web-Service dos Correios e fazer o c??lculo de frete para um determinado peso, local e tipo de frete. Pelo Web-Service ?? poss??vel consultar SEDEX, e-SEDEX e PAC. Lembrando que, para o tipo e-SEDEX e outros, a empresa deve ter um contrato com os Correios para utilizar essa modalidade. Isso ser?? mostrado como informar o login dos Correios antes de fazer a consulta.

Antes de come??ar, veja abaixo as formas de consulta que os Correios disp??e (retirado do site):

Forma de acesso e resposta Defini????o Exemplos de uso Protocolos de Acesso e de Resposta
Webservice A consulta utiliza a tecnologia webservices ??? cole????o de protocolos e padr??es usados para troca de informa????es entre aplica????es Internet. Lojas virtuais 
Sistemas corporativos
Acesso e resposta via XML, SOAP e WSDL – protocolos dewebservices
Resultado XML A consulta retorna os dados em formato XML, para livre tratamento das informa????es pelo cliente. Lojas virtuais 
Sites de empresas
Acesso via post
Resposta padr??o XML
Resultado p??gina do cliente A consulta transfere as informa????es de resposta para uma p??gina do cliente, por ele especificada. Sites de empresas Acesso via post 
Resposta via get
Resultado p??gina dos Correios A resposta vem numa p??gina dos Correios, em formato de p??gina pop-up. Call-centers Acesso via post 
Resposta em p??gina dos Correios

Conforme explicado, vamos utilizar o Web-Service para consumir e obter a resposta desejada. Nesse link tem o manual com maiores detalhes acerca do uso. Vamos a implementa????o!

Crie/Abra um Web Site e clique com o direito sobre o projeto para abrir o menu. Escolha a op????o Add Web Reference… .

Informe a URL http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx e clique em Go. Aguarde a realiza????o da busca pelo Web-Service, renomeie o servi??o (caso deseje) e escolha Add Reference.

Veja que em seu projeto ir?? surgir uma pasta nova denominada App_WebReferences e seu web.config ter?? uma nova entrada. Agora, preparemos o seguinte m??todo (s??o apenas sugest??es, pode melhor??-la ou adequar a sua necessidade):

private string ConsultaWebService()
    {
        // Dados da empresa, se tiver contrato com os Correios
        string nCdEmpresa = string.Empty;
        string sDsSenha = string.Empty;
        // C??digo do tipo de frete – por padr??o deixei o SEDEX
        string nCdServico = “40010”;
        // Cep de origem e destino – apenas n??meros
        string sCepOrigem = “40280000”;
        string sCepDestino = “40280000”;
        // Peso total da encomenda – por padr??o deixei 1kg
        string nVlPeso = “1”;
        // Formato da encomenda – por padr??o deixei caixa
        int nCdFormato = 1;
        // Para encomenda do tipo PAC, deve-se preencher a dimens??o da embalagem
        decimal nVlComprimento = 0;
        decimal nVlAltura = 0;
        decimal nVlLargura = 0;
        decimal nVlDiametro = 0;
        // Informa se ?? por m??o pr??pria – por padr??o deixei N??o
        string sCdMaoPropria = “N”;
        // Valor declarado – por padr??o n??o informo
        decimal nVlValorDeclarado = 0;
        // Se desejo recebr aviso de recebimento – por padr??o n??o quero
        string sCdAvisoRecebimento = “N”;


        // Instancio o web-service
        Correios.CalcPrecoPrazoWS webServiceCorreios = new Correios.CalcPrecoPrazoWS();


        // Efetuo a requisi????o
        Correios.cResultado retornoCorreios = webServiceCorreios.CalcPrecoPrazo(nCdEmpresa, sDsSenha, nCdServico, sCepOrigem, sCepDestino, nVlPeso, nCdFormato, nVlComprimento, nVlAltura, nVlLargura, nVlDiametro, sCdMaoPropria, nVlValorDeclarado, sCdAvisoRecebimento);


        // Verifico se h?? retorno
        if (retornoCorreios.Servicos.Length > 0)
        {
            // Se deu tudo certo, ent??o retorna o valor
            if (retornoCorreios.Servicos[0].Erro == “0”)
                return “R$ “ + retornoCorreios.Servicos[0].Valor;
            else
                return retornoCorreios.Servicos[0].MsgErro;
        }
        else
            return “N??O FOI POSS??VEL CONSULTAR O SERVI??O DESEJADO!”;


    }

No caso, o array de servi??os veio apenas um pois informando na vari??vel nCdServico que era para consultar apenas SEDEX. Pode ser mais de um numa consulta separados por v??rgula, exemplo “40010,81019”.

A tabela de servi??os dispon??veis s??o:

C??digo  Servi??o
41106  PAC sem contrato
40010  SEDEX sem contrato
40045  SEDEX a Cobrar, sem contrato
40215  SEDEX 10, sem contrato
40290  SEDEX Hoje, sem contrato
40096  SEDEX com contrato
40436  SEDEX com contrato
40444  SEDEX com contrato
81019  e-SEDEX, com contrato
41068  PAC com contrato

Essas e outras informa????es voc?? encontra no manual dos Correios. Isso possibilita e facilita bastante ao programador na consulta e obten????o dessa informa????o. Nunca escrevi tanto a palavra Correios em minha vida… T??!

Categorias
dicas web-service

HTTP 417 Expectation failed (falha de expectativa)

Dica r??pida! Esse erro ocorre quando tenta fazer uma requisi????o por WebRequest, Web-Service ou outra requisi????o entre computadores. Para sanar o problema use a chamada antes de realizar o processo:

System.Net.ServicePointManager.Expect100Continue = false;

Para saber mais detalhes sobre erros HTTP 417, acesse aqui.