Rastreamento

Olá…
Necessito enviar um XML para um WS, esse XML tem uma configuração simples, exemplo:

<RequestMensagemCB>
   <login>1234</login>
   <senha>4321</senha>
   <mId>1</mId>
</RequestMensagemCB>

Dai, ele irá me retornar o posicionamentos dos veículos rastreados, em um arquivo compactado que o conteúdo é um XML com o posicionamento dos veículos

Como fazer para solicitar tal arquivos e depois ler e descompactar tal retorno ??
A ideia é salvar isso em um arquivo XML/TXT para ler em outra liguagem e apresentar os dados.

Desculpe, a “leiguice”, mas tentei esboçar a necessidade !

Primeiro, qual o tipo de WS estamos falando? SOAP? REST?
Segundo, se você vai usar outra linguagem para apresentar os dados, sugiro nem mexer com java nessa camada. Não conheço nenhuma linguagem que não suporte, mesmo que de modo arcaico, SOPA e REST.

Acredito que seja REST, pois não tem nenhuma referência a SOAP!
Com relação a usar o JAVA para resolver a questão, meu problema esta na descompactação do retorno, que não tenho ou pelo menos até agora não descobri como fazer…vou colocar aqui um exemplo de código que me forneceram, mas é em C#: vejam

Aqui é a requisição:

private static HttpWebRequest CreateRequest()
{
HttpWebRequest request = 
(HttpWebRequest)WebRequest.Create("http://webservice.onixsat.com.br");
request.Method = "POST";
request.ContentType = "text/xml";
return request;
} 

public static string RequestXml(string strRequest)
 {
           string result = string.Empty;
           try
           {
           // requisição xml em bytes
           byte[] sendData = UTF8Encoding.UTF8.GetBytes(strRequest);
           // cria requisicao
           HttpWebRequest request = CreateRequest();
           Stream requestStream = request.GetRequestStream();
           // envia requisição
           requestStream.Write(sendData, 0, sendData.Length);
           requestStream.Flush();
           requestStream.Dispose();
           // captura resposta
           HttpWebResponse response = (HttpWebResponse)request.GetResponse();
           Stream responseStream = response.GetResponseStream();
           MemoryStream output = new MemoryStream();
           byte[] buffer = new byte[256];
           int byteReceived = -1;            
           do
           {
               byteReceived = responseStream.Read(buffer, 0, buffer.Length);
               output.Write(buffer, 0, byteReceived);
           } while (byteReceived > 0);
           responseStream.Dispose();
           response.Close();
           buffer = output.ToArray();
           output.Dispose();
           // transforma resposta em string para leitura xml
           result = UTF8Encoding.UTF8.GetString(buffer);
       }
       catch (Exception ex)
       {
           // tratar exceção            
          }        
          return result;
}

E essa seria a descompactação do retorno:

public override byte[] Decompress(byte[] data)
  {
      if (IsValidDecompress(data))
      {
          try
          {
              // nome arquivo
              string nameDirectory = Guid.NewGuid().ToString();
              // cria diretorio na pasta temp
              DirectoryInfo dInfo = Directory.CreateDirectory(Path.GetTempPath() + nameDirectory);
              // path arquivo zip
              string pathFileZip = dInfo.FullName + Path.DirectorySeparatorChar + nameDirectory + ".zip";
              // CREATE FILE ZIP
              File.WriteAllBytes(pathFileZip, data);
              // DECOMPRESS
              FastZip fastZip = new FastZip();
              fastZip.ExtractZip(pathFileZip, dInfo.FullName, "");
              // nome do arquivo txt salvo
              string nameFileTxt = Directory.GetFiles(dInfo.FullName, "*.txt")[0];
              // arquivo descompactado em bytes
              byte[] buffer = File.ReadAllBytes(nameFileTxt);
              // exclui diretorio e arquivos da pasta temp
              if (Directory.Exists(dInfo.FullName))
                  Directory.Delete(dInfo.FullName, true);
              return buffer;
          }
          catch (Exception ex)
          {
              throw new ZipLibraryException("Falha ao descompactar arquivo no formato .zip", ex);
          }
      }
      return null;
  }

Mas você vai implementar o que, além dos client? E em qual(is) linguagem(ns)?

Veja, preciso apenas do retorno do WS, eu passo um XML de requisição e ele me retorna o posicionamento dos veículos, até ai tudo blz, dai depois eu vou ler esse retorno. O que acontece é que o retorno que tenho obtido, segundo o fabricante, tem que montar o arquivo zip e depois descompactar e dai eu teria o XML com os dados do rastreamento.

Veja que fiz a requisição em JAVA e esta funcionando (aparentemente), meu problema é o conteúdo desse retorno

Veja a requisição em JAVA:

public class Principal {

public static void main(String[] args) {
    
    if ( args.length > 0) {
        if (args[0].equals("rastreamento")) {
            
            String p_xml = args[1];
            String p_url = args[2];
            HttpURLConnection connection = null;

            // Cria conexão
            try {
                URL url = new URL(p_url);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Content-Type", "text/xml");
                connection.setRequestProperty("Content-Length", Integer.toString(p_xml.getBytes().length));
                connection.setRequestProperty("Content-Language", "UTF8");  

                connection.setUseCaches(false);
                connection.setDoOutput(true);

                //Envia requisicao
                try ( DataOutputStream wr = new DataOutputStream (connection.getOutputStream())) {
                    wr.writeBytes(p_xml);
                    //Pega a resposta
                    InputStream is = connection.getInputStream();
                    try ( BufferedReader rd = new BufferedReader(new InputStreamReader(is))) {
                        StringBuilder response = new StringBuilder(); // or StringBuffer if Java version 5+
                        String line;
                        String result = "";
                        while ((line = rd.readLine()) != null) {
                            result += response.append(line);
                        }
                        System.out.println(result);
                    } 
                }
            }
            catch (IOException e) {
                InfoMsg.mensagem("Erro no acesso ao WS! \n\n"+e.getMessage(), "Erro...", "ERRO");
            }
            finally {
                if (connection != null) {
                  connection.disconnect();
                }
            }
        }
        return;
    }
    
}

Veja, cada linguagem possui suas particularidades quanto ao recebimento. A questão é: qual linguagem você vai usar.
Como te disse, usar java vai adicionar uma complexidade desnecessária.
A não ser que você vá trabalhar com java. Caso contrário, não tem razão de usar java.

Uso HARBOUR, que acredito não tenha a questão da “descompactação” desse retorno, mas sempre utilizo JAVA quando a linguagem em questão não me atende, o que faço, por exemplo, não tinha como concatenar vários arquivos PDF em um só…usei recursos do JAVA e resolveu, ou seja, executo uma linha de comando do JAVA passando parâmetros e executo as funções conforme minha necessidade, a questão da requisição ao WS por exemplo, em HARBOUR blz, foi tranquilo, mas retorna o que ja relatei e “aparentemente” não tenho o recurso para resolver em HARBOUR, então recorro ao JAVA, para tentar solução, que acredito que deva ser uma coisa mais simples de se resolver.

Cara, se o que o WS retorna é um arquivo compactado, então, sim, tem essa questão. Assim como você teria que serializar caso fosse um xml ou um json ou outro formato. Ou teria que gravar no file system caso fosse um arquivo cuja extensão não pode ser interpretada nativamente pela linguagem, como um cab, um pdf e etc.

De qualquer maneira, oque você precisa fazer é dar uma olhada em como tratar isso.

Pronto

                    //Pega a resposta
                    InputStream in = connection.getInputStream();
                    try (FileOutputStream out = new FileOutputStream("download.zip")) {
                        byte[] buf = new byte[1024];
                        int n = in.read(buf);
                        while (n >= 0) {
                            out.write(buf, 0, n);
                            n = in.read(buf);
                        }
                        out.flush();
                    }

Deu certo com o exemplo que me mandou…