Ajuda com consulta de WebService

Bom galera, nem preciso falar que sou iniciante aqui, né… bom li alguns tutoriais, fiz alguns testes etc, mas estacionei aqui nesta parte.
Bom o problema que preciso consultar um webservice e no qual vai me retornar um xml com uma determinada extrutura ex:

<cabecalho>
 <produto>
  <icms></icms>
  <ipi></ipi>
  <pis></pis>
  <cofins></cofins>
 </produto>
</cabeçalho>

Bom dentro deste cabeçalho pode existir vários produtos…
Bom o que eu não sei na verdade é como salvar este aquivo estou fazendo da seguinte maneira para consultar a webservice:

[code]
package br.com.leleco.validadordeproduto.webservice;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class Cliente {

public static void main(String[] args) throws Exception {
    // Endereço, local onde encontra-se o Web Service
    String local = "http://sp.systax.com.br/webservice/systax_erp06.php";
     
     // Criando e configurando o serviço
     Call call = (Call) new Service().createCall();
     // Configurando o endereço.
     call.setTargetEndpointAddress(local);
     // Marcando o método a ser chamado. 
     call.setOperationName("systax");
     
     // Parâmetros da função soma.
     Object[] param = new Object[]{new String("usuario"),new String("senha"), new Integer("1234"),new Integer(10),new String("A"),new Integer(5101),new Integer(739633863) };
     // Retorno da Função 
     
     //como ler este xml de retorno agora?????? digo que tipo de arquivo e como fazer para salvalo.. ?????
    //não sei salvar este xml digo o que ele realmente vai me retornar???
   //estou usando Object pois não tenho idéia de como fazer só para idealizar o que to tentando fazer. 

      Object ret = call.invoke(param);

   // se eu receber neste object poderia converter em um documento e depois em String para salvar um arquivo .xml mas não tenho noção de como fazer isso.

}

}[/code]

Alguém pode me dar uma luz de como continuar a partir dai ???

Oi.

Nunca usei WS dessa forma, muito menos, como um cliente. Eu uso JAXB para trabalhar com o objeto/XML e wsimport para gerar as classes clientes.
É muito simples e fácil. Caso queira:

JAXB: http://www.oracle.com/technetwork/articles/javase/index-140168.html
Uso do wsimport: http://blog.caelum.com.br/webservices-sem-servidor-de-aplicacao-no-java-6/

Sobre o seu código, o que contém o objeto ret ?

boa noite ale.leleco,

bom, você pode gerar um cliente para o web service em dois minutos pelo eclipse.

Você está usando Jersey?
Veja se ajuda http://stackoverflow.com/questions/221442/rest-clients-for-java

[quote=nel]Oi.

Nunca usei WS dessa forma, muito menos, como um cliente. Eu uso JAXB para trabalhar com o objeto/XML e wsimport para gerar as classes clientes.
É muito simples e fácil. Caso queira:

JAXB: http://www.oracle.com/technetwork/articles/javase/index-140168.html
Uso do wsimport: http://blog.caelum.com.br/webservices-sem-servidor-de-aplicacao-no-java-6/

Sobre o seu código, o que contém o objeto ret ?[/quote]

nel. Olá amigo, bom na verdade eu uso a biblioteca javax.xml nativa do JAVA, apesar de ter visto vários outras bibliotécas mais simples de se trabalhar não entendi muito bem como funcionam, sou novato mesmo rsrsr, então uso está bibliotéca padrão

[quote]boa noite ale.leleco,

bom, você pode gerar um cliente para o web service em dois minutos pelo eclipse.[/quote]
novato25
Cara seria uma grande mão na roda, vou dar uma procurada como fazer isso mas se puder me indicar um tutorial ou como fazer vai ajudar muito…

[quote]Você está usando Jersey?
Veja se ajuda http://stackoverflow.com/questions/221442/rest-clients-for-java[/quote]
Não amigo não estou, na verdade nem sei o que é vou dar uma olhada nisto também, meu problema é com o inglês mas valew a ajuda…

Ale, o wsimport é nativo. Ele vem com a sua JDK, se tu configurou nas variáveis de ambiente do seu SO o Java, você pode simplesmente abrir um console e aplicar o comando. Ele “automaticamente” gera as tuas classes clientes, seu trabalho será apenas informar a URL de acesso. Enquanto o WSDL se manter o mesmo, as classes geradas para o cliente poderão ser usadas.

Não tem nada demais e é bem simples de usar. Se retornar um objeto é mais fácil ainda, trabalha diretamente com o objeto, se gerar uma String, sendo seu conteúdo o XML, basta converter para um objetc ou usar o DOM, que também vem nativo.

1 curtida

Bom dia ale.leleco,

para criar um cliente para o Web Service no eclipse é fácil. Você abre o eclipse e cria um projeto java (File->New->Java Project - escolha um nome para o projeto e clique em Finish). Depois clique com o botão direito do mouse em cima do projeto vá em New->Other… procure Web Services e clique em Web Service Client. Na próxima tela, em Service definition coloque o endereço do WSDL do Web Service (no seu caso é: http://sp.systax.com.br/webservice/systax_erp06.php?wsdl). Espere uns 5 segundos até carregar e habilitar o botão Finish. Pronto. Foi gerado um cliente para o web services utilizando o framework axis. Agora crie uma classe com um método main e crie uma instancia de Systax (Verifique se Systax é o nome da interface e procure a classe que implementa esta interface). Acredito que Systax tem o método que vc deseja consultar via web service.

Acho que deve ser algo mais ou menos assim:

[code]public class Main {

  public static void main() {
          Systax systax = Systax.getInstance();
          SystaxRet resultado = systax.systax(..., ..., ...); // método que você deseja consumir do web service
  }

}[/code]

[quote=novato25]Bom dia ale.leleco,

para criar um cliente para o Web Service no eclipse é fácil. Você abre o eclipse e cria um projeto java (File->New->Java Project - escolha um nome para o projeto e clique em Finish). Depois clique com o botão direito do mouse em cima do projeto vá em New->Other… procure Web Services e clique em Web Service Client. Na próxima tela, em Service definition coloque o endereço do WSDL do Web Service (no seu caso é: http://sp.systax.com.br/webservice/systax_erp06.php?wsdl). Espere uns 5 segundos até carregar e habilitar o botão Finish. Pronto. Foi gerado um cliente para o web services utilizando o framework axis. Agora crie uma classe com um método main e crie uma instancia de Systax (Verifique se Systax é o nome da interface e procure a classe que implementa esta interface). Acredito que Systax tem o método que vc deseja consultar via web service.

Acho que deve ser algo mais ou menos assim:

[code]public class Main {

  public static void main() {
          Systax systax = Systax.getInstance();
          SystaxRet resultado = systax.systax(..., ..., ...); // método que você deseja consumir do web service
  }

}[/code][/quote]

Então amigo, já até tinha visto alguem falando isso para min, o problema é que não tem essa opção de WebService quando tento criar alguma coisa dentro do projeto, se puder me ajudar e mostrar como criar ela, deve ser alguma biblioteca que não tenho…

Tópico movido para Desenvolvimento Web.

Por favor, leia com atenção a lista de fóruns antes de postar. Nem tudo é Java Básico.

[quote=nel]Ale, o wsimport é nativo. Ele vem com a sua JDK, se tu configurou nas variáveis de ambiente do seu SO o Java, você pode simplesmente abrir um console e aplicar o comando. Ele “automaticamente” gera as tuas classes clientes, seu trabalho será apenas informar a URL de acesso. Enquanto o WSDL se manter o mesmo, as classes geradas para o cliente poderão ser usadas.

Não tem nada demais e é bem simples de usar. Se retornar um objeto é mais fácil ainda, trabalha diretamente com o objeto, se gerar uma String, sendo seu conteúdo o XML, basta converter para um objetc ou usar o DOM, que também vem nativo.[/quote]

Amigo ajudou muito achei um tuto na internet meio que falando como usar o WSImport, bom consegui gerar a classe, ele gerou um monte de objetos com os Elements do meu xml e também os dados de cabeçalho e tudo mais, blz. só fiquei com uma duvida, bom ele gerou mais 3 classes:

SystaxRet - que pelo que entendi vai estanciar todos os atributos dos objetos e etc montando o xml praticmante;

SystaxPortType - que na verdade é uma interface, eu tenho que instanciala para passar os valores das informações que preciso passar para consultar o webservice, valores como usuario, senha, codigos diversos;

Systax - esta que pelo que percebi tem vários metodos e um deles deve chamar o webservice e fazer a consulta, enviando a SystaxPortType e uma série de outras informações, mas não ache qual realmente o metodo que devo chamar e como fazer para salvar o XML, que é minha idéia original, salrvar o xml que vou ter como retorno para usar depois, será que pode me dar uma ajuda com essa parte ???
O código gerado é este aqui:

package webservice;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.4-b01
 * Generated source version: 2.2
 * 
 */
@WebServiceClient(name = "systax", targetNamespace = "urn:systax", wsdlLocation = "http://sp.systax.com.br/webservice/systax_erp06.php?wsdl")
public class Systax
    extends Service
{

    private final static URL SYSTAX_WSDL_LOCATION;
    private final static WebServiceException SYSTAX_EXCEPTION;
    private final static QName SYSTAX_QNAME = new QName("urn:systax", "systax");

    static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("http://sp.systax.com.br/webservice/systax_erp06.php?wsdl");
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        SYSTAX_WSDL_LOCATION = url;
        SYSTAX_EXCEPTION = e;
    }

    public Systax() {
        super(__getWsdlLocation(), SYSTAX_QNAME);
    }

    public Systax(WebServiceFeature... features) {
        super(__getWsdlLocation(), SYSTAX_QNAME, features);
    }

    public Systax(URL wsdlLocation) {
        super(wsdlLocation, SYSTAX_QNAME);
    }

    public Systax(URL wsdlLocation, WebServiceFeature... features) {
        super(wsdlLocation, SYSTAX_QNAME, features);
    }

    public Systax(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public Systax(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
        super(wsdlLocation, serviceName, features);
    }

    /**
     * 
     * @return
     *     returns SystaxPortType
     */
    @WebEndpoint(name = "systaxPort")
    public SystaxPortType getSystaxPort() {
        return super.getPort(new QName("urn:systax", "systaxPort"), SystaxPortType.class);
    }

    /**
     * 
     * @param features
     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns SystaxPortType
     */
    @WebEndpoint(name = "systaxPort")
    public SystaxPortType getSystaxPort(WebServiceFeature... features) {
        return super.getPort(new QName("urn:systax", "systaxPort"), SystaxPortType.class, features);
    }

    private static URL __getWsdlLocation() {
        if (SYSTAX_EXCEPTION!= null) {
            throw SYSTAX_EXCEPTION;
        }
        return SYSTAX_WSDL_LOCATION;
    }

}

tente fazer algo do tipo:

[code]public class Teste {

   public static void main(String[] args) {

          Systax sys= new Systax();
          SystaxRet retorno = sys.getSystaxPort().systax(<<parâmetros>>);
   }

}[/code]

[quote=novato25]tente fazer algo do tipo:

[code]public class Teste {

   public static void main(String[] args) {

          Systax sys= new Systax();
          SystaxRet retorno = sys.getSystaxPort().systax(<<parâmetros>>);
   }

}[/code][/quote]

Valew amigo vou tentar assim… depois falo… como o cara do Webservice não passou ainda o user e senha… quando tiver alguma coisa eu falo…

Novato25, cara valew mesmo… me ajudou muito bom agora descobri como faço para pegar os valores retornados no xml, erros e tudo mais, pelomenos que eu preciso, bom vou colocar o código aqui só para ser alguem estiver acompanhando e estiver precisando blz. valew galera… mas essa bucha já foi resolvida… Graças a Deus…
Só mente a classe principal pois gerei o cliente atravéz do WSImport


package webservice;

import java.util.Iterator;

public class princiapal {

	public static void main(String[] args) {
		// esta classe encarregada por gerar as demais retornando o objeto feito
		ObjectFactory obf =  new ObjectFactory();
		Icms icms = obf.createIcms();
		IcmsSt icmsst = obf.createIcmsSt();
		Ipi ipi = obf.createIpi();
		Pis pis = obf.createPis();		
		Cofins cofins = obf.createCofins();
		SystaxRet sysretorno =  obf.createSystaxRet();
		Retorno retorno = obf.createRetorno();
		
                // seto as os objetos dentro dos ninhos superiores...
		icms.setIcmsSt(icmsst);
		retorno.setIcms(icms);
		retorno.setIpi(ipi);
		retorno.setPis(pis);
		retorno.setCofins(cofins);	
		
		
		// crio o systax e chamo a webservice passando os parametros obrigatórios
		Systax sys =  new Systax();
		sysretorno = sys.getSystaxPort().systax("usuario", "senha", "parametros", 10, "ABCD", "108", "578", "SP", "RJ", 0, "739633863");
		
		//mostro aqui o retorno que tive da chamada
		System.out.println("Retorno do Chamado para Webservice ...");		
		System.out.println("Codigo natureza operação: " +sysretorno.getCodNaturezaOperacao());
		System.out.println("Destinação " +sysretorno.getDestinacao());
		System.out.println("Origem: "+sysretorno.getOrigem());
		System.out.println("Sistema: "+sysretorno.getSistema());
		System.out.println("Tributo " +sysretorno.getTributo());
		System.out.println("UF Destino: " +sysretorno.getUfDestino());
		System.out.println("UF Origem " +sysretorno.getUfOrigem());
		System.out.println("Ponteiro Ataulziação: " +sysretorno.getPonteiroAtualizacao());
		System.out.println("Status");
		System.out.println("Codigo Status: "+sysretorno.getStatus().getCodStatus());
		System.out.println("Fim do retorno para o chamado ...");

                //mostro aqui os itens que tive de resposta para o xml
		Iterator<Retorno> i = sysretorno.getRetorno().iterator();
		while(i.hasNext()){
			retorno = i.next();
			System.out.println("----Inicio----");
			System.out.println("Código do produto" + retorno.getCodProd());
			System.out.println("Cfop: "+retorno.getCfop());
			System.out.println("Descrição: "+retorno.getDescricao());
			System.out.println("EXTIPI: "+retorno.getExTipi());
			System.out.println("NCM: "+retorno.getNcm());
			System.out.println("CST cofins: "+retorno.getCofins().getCst());
			System.out.println("CST ICMS: "+retorno.getIcms().getCst());
			System.out.println("observações icmsst "+retorno.getIcms().getIcmsSt().getObservacoes());
			System.out.println("observações ipi "+retorno.getIpi().getObservacoes());
			System.out.println("vigencia de PIS "+retorno.getPis().getVigenciaAte());
			System.out.println("----Fim----");
		}

		
	}
}

bom mais uma vez obrigado ai galera pela ajuda… bom feriadão ai pra todo mundo…