RESTO serviço web aceitar um POST usando Restlet - Best Practice
-
22-07-2019 - |
Pergunta
Eu tenho o meu recurso e eles método substituído típico para lidar com solicitações POST.
public void acceptRepresentation(Representation rep) {
if (MediaType.APPLICATION_XML.equals(rep.getMediaType())) {
//Do stuff here
}
else {
//complain!
}
}
O que eu quero saber é a melhor prática para lidar com o meu pacote de XML. Eu vejo um monte de exemplos que usam um formulário - mas certamente há uma maneira de trabalhar com o próprio objeto de representação ou lançá-lo a algum objeto XML útil ???
Qualquer ajuda sobre como você deve e fazer XML de entrada de análise em seu recurso é muito apreciada.
Solução
Este é mais o tipo de resposta que eu estava procurando. Graças à Thierry Boileau para a resposta:
Você pode usar dois tipos de "XML representações ": DomRepresentation e SaxRepresentation. Você pode instanciar ambos com o representação postada. Por exemplo.: DomRepresentation xmlRep = new DomRepresentation (rep);
O DomRepresentation lhe dá acesso ao documento Dom. o SaxRepresentation permite analisar o documento XML com seu próprio ContentHandler. Veja as javadocs aqui 1 e aqui 2.
Outras dicas
No momento não fazer isso usando Resteasy, que é uma implementação alternativa JAX-RS. Usamos ligações JAXB (anotações) para mapear entre o XML e os nossos POJOs modelo e especifique um provedor de JAXB para JAX-RS para que ele saiba como. Isto é descrito em nosso RESTful serviços web em Java EE com RESTEasy (JAX-RS) artigo , o que pode ajudar.
Update: para Restlet, o JAXB extensão pode ser o que você precisa.
Através do método representation.getText()
, você pode obter uma String que pode ser alimentado em um parser SAX ou leitor de dom.
@Simon E
Eu não entendo: qual implementação REST para Java você está usando
Então, eu apenas dar-lhe um exemplo de como usar JAX-RS (implementação Jersey)
A parte do servidor (método de alguma classe REST):
@POST
@Path("/upload")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public static Response upload(
@FormParam("name") String name,
@FormParam("content") String content)
throws Exception {
// NOTE: you get your content as String
// (do something here)
return Response.ok().build();
}
A parte cliente (método de algum teste JUnit):
@Test
public void uploadFile()
throws Exception {
String address = "http://0.0.0.0:8000/r/upload";
WebResource r = Client.create().resource(address);
Form form = new Form();
form.add("name", "test");
form.add("content", "SOME CONTENT GOES HERE");
String s = r.post(String.class, form);
System.out.println(s);
}
É isso aí !!!
No caso de você ter problemas com as importações:
Servidor precisa javax.ws.rs. * E javax.ws.rs.core. *
Cliente precisa com.sun.jersey.api.client. * E
com.sun.jersey.api.representation. *
De qualquer maneira, eu iria dar-lhe o conselho para usar JAX-RS, em vez de implementações alternativas, porque JAX-RS farão parte do próximo Java EE 6
Este é o mesmo procedimento, mesmo em Restlet 2.0 ??
Eu uso 2.0m6 Restlet e aqui está o trecho de código que eu uso -
@Post
processo de representação pública (entidade Representação)
{
try
{
DomRepresentation dom = new DomRepresentation (entidade);
Documento d = dom.getDocument ();
.
.
} catch (Exception e)
{e.printStackTrace (); }
e lança uma exceção de ponteiro nulo na linha dom.getDocument (). O que significa que há dados realmente chegou.
E minha aparência bits flexíveis como este - serviço var: HTTPService = new HTTPService (); service.method = "POST"; service.contentType = "application / xml" service.url = url; var token: AsyncToken = service.send (params);
onde params é um objeto XML.