Integração via WebService com correios

Boa tarde a todos.

Considerando a necessidade de criar uma integração com o correios para calculo de preço e prazo para o frete me é dado 3 opções XML, SOAP e WSDL. Considerando que a opção REST não está disponivel (pelo menos nao encontrei nenhuma documentação) e que SOAP está depreciada (1.1) qual melhor opção e API á utilizar para realizar esta integração?

Engraçado que XML, SOAP e WSDL fazem parte da mesma estrutura, que é, para o java, JAX-WS. Basicamente, XML é o que transita, SOAP é o protocolo deste tipo de integração e WSDL é o contrato onde são definidos os modelos a serem utilizados para padronizar o sistema cliente e o sistema que disponibiliza o(s) web service(s).
É, sim, uma tecnologia mais antiga, porém, em larga utilização em várias empresas, dos mais diversos portes.
É mais complexa que REST? Com toda a certeza, porém, com um pouco de dedicação é possível criar um sistema bom, rápido e seguro.

1 curtida

Obrigado pela resposta. A api JAX-WS cuida das 3 partes? Transição do XML, utilização do protocolo SOAP e o WSDL?

A partir do WSDL você consegue criar um client para o web service que vai, através do protocolo SOAP, trafegar dados em XML.

Se você já tem o WSDL (seja o arquivo ou a URL para o mesmo), sua IDE permite criar um client básico.

Tudo que tenho é isso e umas tags a se utilizarem.

POST /calculador/CalcPrecoPrazo.asmx HTTP/1.1
Host: ws.correios.com.br
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <CalcDataMaxima xmlns="http://tempuri.org/">
      <codigoObjeto>string</codigoObjeto>
    </CalcDataMaxima>
  </soap12:Body>
</soap12:Envelope>

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <CalcDataMaximaResponse xmlns="http://tempuri.org/">
      <CalcDataMaximaResult>
        <Objetos>
          <cObjeto>
            <codigo>string</codigo>
            <servico>string</servico>
            <cepOrigem>string</cepOrigem>
            <cepDestino>string</cepDestino>
            <prazoEntrega>int</prazoEntrega>
            <dataPostagem>string</dataPostagem>
            <dataPostagemCalculo>string</dataPostagemCalculo>
            <dataMaxEntrega>string</dataMaxEntrega>
            <postagemDH>string</postagemDH>
            <dataUltimoEvento>string</dataUltimoEvento>
            <codigoUltimoEvento>string</codigoUltimoEvento>
            <tipoUltimoEvento>string</tipoUltimoEvento>
            <descricaoUltimoEvento>string</descricaoUltimoEvento>
            <erro>string</erro>
            <msgErro>string</msgErro>
            <nuTicket>string</nuTicket>
          </cObjeto>
          <cObjeto>
            <codigo>string</codigo>
            <servico>string</servico>
            <cepOrigem>string</cepOrigem>
            <cepDestino>string</cepDestino>
            <prazoEntrega>int</prazoEntrega>
            <dataPostagem>string</dataPostagem>
            <dataPostagemCalculo>string</dataPostagemCalculo>
            <dataMaxEntrega>string</dataMaxEntrega>
            <postagemDH>string</postagemDH>
            <dataUltimoEvento>string</dataUltimoEvento>
            <codigoUltimoEvento>string</codigoUltimoEvento>
            <tipoUltimoEvento>string</tipoUltimoEvento>
            <descricaoUltimoEvento>string</descricaoUltimoEvento>
            <erro>string</erro>
            <msgErro>string</msgErro>
            <nuTicket>string</nuTicket>
          </cObjeto>
        </Objetos>
      </CalcDataMaximaResult>
    </CalcDataMaximaResponse>
  </soap12:Body>
</soap12:Envelope>

Até achei uma API pronta no GIT, eu mando so os valores e a api cuida da formatação e envio, mas eu quero aprender integrar !

Esta estrutura que você postou são o que chamamos de payload.
O primeiro, aparenta ser o payload de request (o que é enviado) e o segundo de response (o que é recebido).
Apenas a partir deles não é possível fazer muita coisa, você precisa, realmente, é do WSDL.
Em geral, a URL de acesso a um WSDL apresenta um ?wsdl ao fim, podendo varia para ?WSDL ou para .wsdl, dependendo de como o WS foi implementado.

E por que o WSDL é tão importante?
O WSDL ou Web Service Definition Language é um XML que vai conter as informações de quais e quantos forem os serviços disponíveis, quais namespaces estão envolvidos, quais são as portas e os bindings, bem como, conterá a referência aos XSDs (Xml Schema Definition - definição da estrutura de XML a ser utilizada para construir o que será enviado ao servidor (request) e o que será retornado do servidor (response)).

1 curtida

Sugiro, fortemente, dar uma boa olhada nestes tutoriais:


https://www.journaldev.com/9131/soap-webservices-in-java-example-eclipse
https://www.journaldev.com/9123/jax-ws-tutorial

Darlan, eu observei aqui que uma consulta nessa pagina
http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=08082650&sDsSenha=564321&sCepOrigem=74420180&sCepDestino=74303010&nVlPeso=1&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=n&nVlValorDeclarado=0&sCdAvisoRecebimento=n&nCdServico=04510&nVlDiametro=0&StrRetorno=xml&nIndicaCalculo=3
passando os parametros corretos eu consigo os valores corretos referentes ao preço e prazo igual consta no site… A minha pergunta é: é muito feio eu utilizar essa forma para consulta de preço e prazo? É usual isso ai? Vou utilizar o Jquery pra pegar a XML de retorno e exibir na view os valores tao como enviar para o bean realizar o pedido baseado nesses valores…

Cara, este é um WS REST, pelo que dá pra perceber.