【问题标题】:REST web service accepting a POST using Restlet - Best PracticeREST Web 服务使用 Restlet 接受 POST - 最佳实践
【发布时间】:2009-01-13 21:58:53
【问题描述】:

我有我的资源,它们是处理 POST 请求的典型重写方法。

public void acceptRepresentation(Representation rep) {

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

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

非常感谢您对如何解析资源中的传入 XML 的任何帮助。

【问题讨论】:

  • 您能否举个例子,说明您如何使用帖子和参数调用 REST Web 服务。谢谢,罗伊

标签: java web-services rest post restlet


【解决方案1】:

这更像是我一直在寻找的那种回应。感谢Thierry Boileau的回答:

您可以使用两种“XML 表示”:DomRepresentation 和 SaxRepresentation。你可以 用 张贴表示。例如。: DomRepresentation xmlRep = 新 DomRepresentation(rep);

DomRepresentation 为您提供访问权限 到 Dom 文档。这 SaxRepresentation 允许您解析 带有您自己的 XML 文档 内容处理程序。在此处查看 javadocs 1 和这里 2。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,因为 Restlet 也是一个 JAX-RS 实现。抱歉我没说清楚。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      @Simon E

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

      所以,我只是给你一个使用 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

      【讨论】:

        【解决方案5】:

        即使在 restlet 2.0 中也是同样的过程??

        我使用restlet 2.0m6,这是我使用的代码sn-p -

        @发布

        公共表示过程(表示实体)

        {

        试试

        {

        DomRepresentation dom = new DomRepresentation(entity);

        文档 d = dom.getDocument();

        .

        .

        } 捕获(异常 e)

        { e.printStackTrace(); }

        它会在 dom.getDocument() 行抛出空指针异常。这意味着实际上没有数据到达。

        我的 flex 位看起来像这样 - var service : HTTPService = new HTTPService(); service.method="POST"; service.contentType="应用程序/xml" service.url=url; var token :AsyncToken = service.send(params);

        其中 params 是一个 XML 对象。

        【讨论】:

          猜你喜欢
          • 2014-03-15
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          • 2014-01-04
          • 2014-07-07
          • 2011-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多