Dúvida WebService

Olá pessoal tudo bem?

Estou iniciando no WebService e logo de cara, como esperado, estou tendo problemas.

Meu caso é o seguinte…

Preciso criar uma aplicação que faça uma requisição de consulta de cálculo ao WebService dos correios (http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/)

Utilizei a geração de códigos-fonte jax-ws padrão do netbeans, gerando assim toda a parte das classes de Serviço automaticamente.

Ao tentar realizar a minha consulta no WS ele retorna o seguinte erro

“javax.xml.ws.soap.SOAPFaultException: System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: .
at System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)”

Já pesquisei o erro em vários lugares e não consegui resolver.

Pelo que entendi o netbeans cria as classes de Serviço e seta os parâmetros automaticamente. Procurei pelo SoapAction e ele se encontra na classe “CalcPrecoPrazoWSSoap”, gerada pelo próprio netbeans. O estranho é que nessa classe ele atribui action = “http://tempuri.org/CalcPrecoPrazo” e o que me parece que está acontecendo é que a requisição de consulta está pegando um action vazio.
Alguém pode me ajudar com isso? não sei mais o que fazer :confused:

Coloquei algumas imagens, referentes ao passos que segui para obter a conexão ao WS

Desde já agradeço






Isso acontece porque você está construindo um web service dinâmico (usando Dispatcher). Alguns serviços SOAP precisam de um header HTTP chamado SOAPAction, que é usado para endereçar qual método do servidor deve ser executado. Como você está usando esse web service de maneira dinâmica, você não está ajustando esse valor.

Aliás, porque você está usando de maneira dinâmica? Já tentou usar o wsimport? Eu testei aqui e funcionou.

[]'s

Oi Alexandre, primeiramente obrigado pela resposta

Então, como eu disse eu sou novo em WebService, nunca tinha mexido, não conheço nada dessa área e tentei fazer da maneira mais simples, deixando o NetBeans gerar tudo pra mim.
Pelo jeito então não é tão padrão assim o modo de operar com esse serviço.

Eu usei tudo dinâmico pq isso foi gerado automaticamente e não sei como fazer de outra forma.
Será que você poderia me mostrar como devo fazer para esse serviço funcionar de maneira “não-dinâmica”?

Enfim, vou também pesquisar sobre wsimport que comentou

Obrigado

[quote=besoares90]Oi Alexandre, primeiramente obrigado pela resposta

Então, como eu disse eu sou novo em WebService, nunca tinha mexido, não conheço nada dessa área e tentei fazer da maneira mais simples, deixando o NetBeans gerar tudo pra mim.
Pelo jeito então não é tão padrão assim o modo de operar com esse serviço.

Eu usei tudo dinâmico pq isso foi gerado automaticamente e não sei como fazer de outra forma.
Será que você poderia me mostrar como devo fazer para esse serviço funcionar de maneira “não-dinâmica”?

Enfim, vou também pesquisar sobre wsimport que comentou

Obrigado[/quote]

Então, justamente. Com o wsimport, você consegue gerar um cliente que vai funcionar pra você como se fosse uma classe Java comum. Eu fiz o seguinte para gerar aqui:

-> Criei uma pasta ‘generated’
-> Executei

wsimport -s generated http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?wsdl

Assumindo, claro, que o wsimport está na sua variável PATH. Se não estiver, basta ir até a pasta bin da sua JDK.

Quando você executar este comando, só pegar o conteúdo da pasta generated e copiar para a pasta do seu projeto.

[]'s

Por favor evite tags inúteis no título do seu tópico, como [Ajuda] ou [Dúvida].

Estou com o mesmo problema…
Na verdade Alexandre, ele consegue importar as classes automaticamente com o netbeans…
Tanto que é gerado código automatico ao arrastar o serviço

Talvez seja algum detalhe que está faltando, mas também não descobri… :frowning:

[quote=rdlorbieski]Estou com o mesmo problema…
Na verdade Alexandre, ele consegue importar as classes automaticamente com o netbeans…
Tanto que é gerado código automatico ao arrastar o serviço

Talvez seja algum detalhe que está faltando, mas também não descobri… :frowning:
[/quote]

Poste o código que você está usando. Pode ser que, no seu caso, a mensagem seja a mesma mas o problema seja outro.

[]'s

Olá Alexandre, obrigado pela atenção, mas resolvi hoje a consulta…

besoares90 ao invés de fazer por geração automática de código, tente pelo seguinte método:

private static void calcPrazo(String nCdServico, String CepOrigem, String CepDestino) {
    wscorreios.CalcPrecoPrazoWS service = new wscorreios.CalcPrecoPrazoWS();
    CResultado retornoCorreios = service.getCalcPrecoPrazoWSSoap().calcPrazo(nCdServico, CepOrigem , CepDestino);
    System.out.println("retorno prazo entrega = "+retornoCorreios.getServicos().getCServico().get(0).getPrazoEntrega());   
}

Aqui deu certo…

Mas também gostaria de entender a razão dessa excessão para o código gerado automaticamente, em teoria o header gerado está correto :frowning:

Valeu rdlorbieski!!! Era isso mesmo que eu precisava, funcionou aqui de primeira =D

Tive que modificar um pouco o código para funcionar. Segue

[code]package org.tempuri;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import org.apache.axis.AxisFault;

public class Teste {

/**
 * @param args
 */
public static void main(String[] args) {
	//http://www.correios.com.br/webServices/PDF/SCPP_manual_implementacao_calculo_remoto_de_precos_e_prazos.pdf
	String codServico = "40010"; //SEDEX sem contrato
	String cepOrigem = "82310510";
	String cepDestino = "05716090";
	calcPrazo(codServico,cepOrigem,cepDestino);
}

private static void calcPrazo(String nCdServico, String CepOrigem, String CepDestino) {
	// CalcPrecoPrazoWS service = CalcPrecoPrazoWS.class;
	try {
		CalcPrecoPrazoWSSoapProxy service = new CalcPrecoPrazoWSSoapProxy();
		CResultado retornoCorreios = service.getCalcPrecoPrazoWSSoap().calcPrazo(nCdServico, CepOrigem, CepDestino);
		CServico[] cservico = retornoCorreios.getServicos();
		String prazo = cservico[0].getPrazoEntrega();
		
		
		System.out.println("retorno prazo entrega = " + prazo);

	} catch (AxisFault e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (RemoteException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}


}

}
[/code]

PS.: Se alguém tiver como dar alguma dica para minha dúvida em outro tópico “Criação de client Webservice de serviço construído em ASP.NET XML”, agradeço
http://www.guj.com.br/java/286446-criacao-de-client-webservice-de-servico-construido-em-aspnet

obrigado