使用Restlet接受POST的REST Web服务 - 最佳实践

时间:2009-01-13 21:58:54

标签: java web-services rest post restlet

我有我的资源和他们典型的重写方法来处理POST请求。

public void acceptRepresentation(Representation rep) {

  if (MediaType.APPLICATION_XML.equals(rep.getMediaType())) {
      //Do stuff here
  }
  else {
      //complain!
  }
}

我想知道的是处理我的XML数据包的最佳做法。我看到很多使用Form的例子 - 但是肯定有一种方法可以使用Representation对象本身或将它转换为一些有用的XML对象???

非常感谢您应该如何处理以及如何解析资源中的传入XML。

5 个答案:

答案 0 :(得分:3)

这是我正在寻找的更多回应。感谢Thierry Boileau获得答案:

  

您可以使用两种“XML   陈述“:DomRepresentation   和SaxRepresentation。您可以   用它来实例化它们   发布的代表。例如。:   DomRepresentation xmlRep = new   DomRepresentation(REP);

     

DomRepresentation为您提供访问权限   到Dom文件。该   SaxRepresentation允许你解析   您自己的XML文档   contentHandler时。在这里查看javadocs   1和这里2。

     
      
  1. http://www.restlet.org/documentation/1.1/api/org/restlet/res​ource/DomRepresentat​ion.html

  2.   
  3. http://www.restlet.o​rg/documentation/1.1​/api/org/restlet/res​ource/SaxRepresentat​ion.html

  4.   

答案 1 :(得分:1)

我们目前使用RESTeasy执行此操作,RESTeasy是另一种JAX-RS实现。我们使用JAXB绑定(注释)在XML和我们的模型POJO之间进行映射,并为JAX-RS指定 JAXB提供程序,以便它知道如何操作。我们的RESTful web services in Java EE with RESTEasy (JAX-RS) article对此进行了描述,这可能有所帮助。

更新:对于Restlet,JAXB extension可能就是您所需要的。

答案 2 :(得分:0)

通过representation.getText()方法,您可以获得可以输入SAX解析器或dom读取器的String。

答案 3 :(得分:0)

@Simon E

我不明白:您使用的是哪种Java实现?

所以,我给你一个使用JAX-RS(Jersey实现)

的例子

服务器部分(某些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();
}

客户端部分(某些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);
}

就是这样!!!

如果您遇到进口问题:
服务器需要javax.ws.rs。*和javax.ws.rs.core。*
客户需要com.sun.jersey.api.client。*和 com.sun.jersey.api.representation。*

无论如何,我会给你建议使用JAX-RS而不是 替代实现,因为JAX-RS将成为其中的一部分 即将发布的 Java EE 6

答案 4 :(得分:0)

即使在restlet 2.0中,这个程序是否相同?

我使用restlet 2.0m6,这是我使用的代码片段 -

@Post

公众代表处理(代表实体)

{

{

DomRepresentation dom = new DomRepresentation(entity);

文件d = dom.getDocument();

} catch(例外e)

{e.printStackTrace(); }

并在dom.getDocument()行中抛出Null Pointer异常。这意味着实际上没有数据到达。

我的flex位看起来像这样 - var service:HTTPService = new HTTPService(); service.method = “POST”; service.contentType =“application / xml”service.url = url; var token:AsyncToken = service.send(params);

其中params是一个XML对象。