Integração com WebService via XML

Oi galera , preciso fazer um integração com o webservice passando um xml e receber um xml de resposta… no Servlet.

Alguem pode me ajudar a faze isso?
Fazer um @PUT usar HTTPCliente por favor se alguem souber fazer me ajude da algum exemplo de codigo que eu me viro !
Brigado.

Antes de mais nada, explique… porque você precisa fazer com servlets?

[]´s

Pq eu vou receber umas informações de um usuario vindo de um jsp pode ser via outra classe nao tem problema.
Depois vou passar as informções do usuario via xml e receber via xml as informações completa dele e verificar o status dele que vai estar dentro do xml.

[quote=hich]Depois vou passar as informções do usuario via xml…
[/quote]
Por que não passa essas informações através de um POST ou um GET comum? Algum motivo especial para ter que usar XML?

Sou obrigado a fazer a chamada através do método HTTP PUT(ou POST), com mime type do conteúdo como text/xml.

XML Request Autorização:
PUT http…

123
127.0.0.5

e receber um XML Response Autorização:

123
127.0.0.5
Autorizado

Olha só, o que você quer tem toda a cara de um serviço REST. Porque você não dá uma procurada em como fazer um desses, ao invés de querer fazer “na unha” ?

[]´s

É exatamente isso o problema é que eu não estou encontrando um lugar que me explique como fazer um serviço Rest…
eu procurei e achei em varios lugares…, mais nada que eu conseguisse aplicar aqui.
Achei esse http://www.k19.com.br/artigos/criando-um-webservice-restful-em-java/ que foi o melhor…
Mais nao serve para mim… pq nao ensina como vou mandar o xml e como vou receber esse é a minha grande dificuldade…

Abraço.

Procure por frameworks que façam. Recentemente (ou nem tanto, rs) saiu uma especificação para isso, chamada JAX-RS. Você pode usar essa palavra chave em suas buscas. Os principais frameworks, IMHO, pra isso, são o RESTEasy e o Restfulie.

[]´s

Entendi…, eu estava procurando libs em vez de frameworks…

vou tentar aqui qualquer coisa falo com você.
Brigadao

Eu estava pensando em usar um framework restlet.
www.restlet.org/ tu conhece? nao sei se é bom

Eu tinha olhado ja aquele post do k19
http://www.k19.com.br/artigos/criando-um-webservice-restful-em-java/
Só que eu ainda nao entendi como eu vou conseguir conectar ah um HTTP.
Passar meu XML para lá e Receber um XML…

Dentro do doPut.
Tentei varias vezes usar um HttpClient mais nao consigo…
PutMethod put = new PutMethod(“http://isp-authenticator.dev.globoi.com:8280/autorizacao”); tentei usa esse PutMethod (q imagino que sirva para fazer o que eu quero… mais também da erro.)
Usando uma lib desse framework Retlet tentei usar esse client:
Client c = new Client(“http://autenticacao.globo.com/ws/rest/autorizacao”); tentei isso mais também não deu.

E por mais que consiga…, nao sei como irei jogar o xml para la e receber o xml.
@Path("{id}")
@PUT
@Consumes(“text/xml”)
@Produces(“text/plain”)
public String atualizaBanda(Banda banda, @PathParam(“id”) int id) {
Banda atual = bandasMap.get(id);
atual.setNome(banda.getNome());
atual.setAnoDeFormacao(banda.getAnoDeFormacao());
return banda.getNome() + " atualizada.";
}
tipo nesse código que ta lá no K19 nao sei onde ele passa XML (se passa) e onde e ele recebe…, ai pelo visto ele está recebendo um id, mais eu precisava mandar e receber um objeto Usuario.
Me diz ± onde eu jogo esse endereço http://iso-… e onde eu mando o xml pra esse webservice e onde recebo o xml.

olhei todos os sites que vc me mostrou e tudo fiz…, só q nada me diz como conectar ao http mandar o xml e receber…, fazer o xml nao é o problema.

Se puder me dar um exemplo ficarei mt grato…, nao to conseguindo nem utilizar o httpclient
Abraço.

Olá!

O caminho mais simples é vc usar a api JAXB(usar os marshaller e unmarshaller) para tratar o xml recebido.

Depois de tratado e só vc criar um webservice (rest ou jax-ws), que recebe e envia uma string(no formato xml).

Até mais

Olá hich,

O indicado já que você está utilizando o Jersey, é utilizar o próprio jersey-client para construir a aplicação cliente.

Se você baixar o código do artigo da K19, pode testar este cliente que eu fiz rapidinho, testado e aprovado na minha máquina :slight_smile:
Tentei colocar alguns comentários para ver se fica mais claro:

package client;

import javax.ws.rs.core.MediaType;

import br.com.k19.models.Banda;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;

public class ExemploDeCliente {

	public static void main(String[] args) {
		Client client = Client.create();

		client.getProperties()
				.put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);

		WebResource resource = client
				.resource("http://localhost:8080/restful-exemplo/rest/bandas");

		// Exemplo GET com string
		String response = resource.path("1").get(String.class);
		System.out.println("Response do GET: " + response);

		// Exemplo GET com Banda
		ClientResponse clientResponse = resource.path("1").get(
				ClientResponse.class);
		// vc "converte" o xml da resposta em um objeto usando getEntity
		Banda b = clientResponse.getEntity(Banda.class);
		System.out.println("Nome da banda com id=1: " + b.getNome());

		// Exemplo POST com string
		String content = "<banda><nome>Teste</nome><anoDeFormacao>2010</anoDeFormacao></banda>";
		response = resource.type(MediaType.TEXT_XML)
				.post(String.class, content);
		System.out.println("Response do POST: " + response);

		// Exemplo PUT com string
		content = "<banda><nome>Teste depois do PUT</nome><anoDeFormacao>9999</anoDeFormacao></banda>";
		// PUT http://localhost:8080/restful-exemplo/rest/bandas/3
		response = resource.path("3").type(MediaType.TEXT_XML)
				.put(String.class, content);
		System.out.println("Response do PUT: " + response);

		// Exemplo PUT com classe Banda
		Banda banda = new Banda();
		banda.setAnoDeFormacao(8888);
		banda.setNome("Teste alterado de novo");

		response = resource.path("3").type(MediaType.TEXT_XML)
				.put(String.class, banda);
		System.out.println("Response do PUT de novo: " + response);
	}
}

Ah, é claro que que além de baixar o código lá da K19 pro exemplo acima funcionar, você também deve adicionar o jar do jersey-client ao projeto.

alexmacedo, parabéns pelo Artigo na k19.
bom gostaria de saber como consumir o metodo @DELETE, andei dando uma olhada e vi que alguns foruns sugerem a reescrida do metodo @POST com um cabeçalho diferente tipo “delete/{codigo}”, o que vc me diz?

fazendo assim:

@Path("{id}") 
@DELETE 
@Produces("text/plain") 
public String removeBanda(@PathParam("id") int id) { 
bandasMap.remove(id); return "Banda removida."; 
} 
//é executando assim:
resource.path("1").delete();

Funciona blz, só que gostaria que que fosse passado um objeto banda no lugar do codigo da banda, assim como foi feito no atualiza.

desde já muito obrigado.

Gostaria de consumir algo mais ou menos assim:

@DELETE
@Produces({MediaType.TEXT_XML,MediaType.APPLICATION_XML})
    public void delete (T toDelete) {
        deleteFromDatabase(toDelete);
    }

[quote=lazaru]Gostaria de consumir algo mais ou menos assim:

@DELETE @Produces({MediaType.TEXT_XML,MediaType.APPLICATION_XML}) public void delete (T toDelete) { deleteFromDatabase(toDelete); } [/quote]

Postei um conteúdo no meu blog, há um tempo atrás, mostrando como fazer isso (com Jersey e Spring). Dê uma olhada lá, talvez ajude.

[]´s

[quote=hich]É exatamente isso o problema é que eu não estou encontrando um lugar que me explique como fazer um serviço Rest…
eu procurei e achei em varios lugares…, mais nada que eu conseguisse aplicar aqui.
Achei esse http://www.k19.com.br/artigos/criando-um-webservice-restful-em-java/ que foi o melhor…
Mais nao serve para mim… pq nao ensina como vou mandar o xml e como vou receber esse é a minha grande dificuldade…

Abraço.[/quote]

Muito bom este tutorial. Aliás, a escola K19 é muito boa, já fiz curso lá e recomendo.

obrigado Alexandre, foi justamente de seu artigo que saiu a inspiração, mas acho que meu problema e em consumir este metodo @DELETE, como vc consome o seu metodo DELETE do seu artigo?

Só mudar o método HTTP… assim como você tem PUT, POST, GET… delete!

Do jeito como você estava fazendo, com o jersey (resource.path().delete() ) tava certinho… deu algum erro, ou algo assim?

Outra coisa, pode ser que tenha a ver… o Jersey reclama quando tem algum método exposto que é void (ele não chega a dar erro, mas dá uma chiada). De repente, pode ser uma luz aí pra você.

[]´s

usando este codigo não gera erro algum, só que gostaria que ele apaga-se o objeto que passei como parametro, assim eu usaria um codigo parecido com este no server:

@DELETE   
@Produces({MediaType.TEXT_XML,MediaType.APPLICATION_XML})   
    public void delete (T toDelete) {   
        deleteFromDatabase(toDelete);   
    }  

onde toDelete seria o objeto a ser deletado, estava tentando usar desta forma para consumir usando o “jersey-client-1.5.jar”:

resource.path().delete(String.class, toDelete);
//gera um codigo assim:
[java.net.ProtocolException: HTTP method DELETE doesn't support output]

Bom dia a todos
Estou montando um webservice Resftul, utilizando text/xml, e estou me baseando no artigo do k19 para montar o server e estou utilizando o modelo do client que foi postado aqui no forum.
No meu server está mapeada uma função que recebe via POST meu XMLRootElement e faz as devidas operações. meu client está enviando via POST a string do XML que representa o @XmlRootElement para o server, mas o servidor estoura este erro quando eu tento dar um get em algum parametro dessa classe:

com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException GRAVE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container java.lang.NullPointerException

Preciso de-serializar essa String XML no server para conseguir acessar esses campos? no artigo nao mosta essa de-serialização