【问题标题】:Providing RESTful JSON API in Java在 Java 中提供 RESTful JSON API
【发布时间】:2013-06-09 15:33:32
【问题描述】:

在 Java 中提供 RESTful JSON API 的惯用方式是什么?您是否使用 JAX-WS 和 XML 注释(@XmlElement 等)?您如何将带注释的对象序列化为 JSON(使用 Jackson 或类似库)?如何将域对象与发送到 API 的对象分开?

我了解 Java,希望您能向我指出有关这些主题的良好资源和最佳实践。

谢谢!

【问题讨论】:

  • JAX-WS 是关于 SOAP,JAX-RS 是关于 REST。
  • 也许“jersey”是一个不错的关键字。
  • @Tichodroma 谢谢,Java 世界里有这么多首字母缩略词 :)
  • @Fildor 我采用了一个尝试提供 REST API 的项目。但是,在我看来,它并没有解决问题,它需要重构。我试图寻求该领域的最佳实践。
  • 在我的答案中添加了一些代码。 :)

标签: java json web-services api


【解决方案1】:

我会简单地使用Play 来节省我已经完成的大量工作。 该链接适用于 Play 1.2,虽然当前版本是 2.1,但它也应该适合该版本。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我对服务器端感兴趣。客户端不多。
    • @JakubKulhan 请参阅第三个链接。您有一个完整的 REST 服务器 Jersey 示例,其中 Tomcat 作为服务器,Android 在客户端。
    • 啊,谢谢!另一件事是模型对象和API中暴露的对象的耦合。目前,我得到的项目非常紧密地结合了 API 中向其内部对象公开的内容。当某些事情发生变化时,几乎可以肯定会破坏 API。如何解耦它们?两个独立的对象层次结构?目前它只是再次重写所有内容。但在未来,这种层次结构可能会改变。
    【解决方案3】:

    我已经愉快地使用了 Jersey/JAX-RS,但我建议你 Spring MVC 3,不仅是为了支持其余的 api,还为了其他有趣的东西,如 IoC 或可能变成的 bean有用。

    这里有一个链接可以参考:http://blog.springsource.org/2009/03/08/rest-in-spring-3-mvc/

    顺便说一句,我使用 Jackson 和 Spring 作为解析器。 :)


    一些代码(基本上用@XmlRootElement 标记你的bean,并使用@Path 标记API)

    JAX-RS

    豆子:

    @XmlRootElement
    public class Response {
    
      private String result;
      private String message;
    
      //getter and setter
    }
    

    api:

    @Path("rest/user")
    @Produces(MediaType.APPLICATION_JSON)
    public class UserService {
    
      @POST
      @Path("/login")
      public Response login(
            @FormParam("username") String username,
            @FormParam("password") String password
      ) {
          // Your logic here
      }
    }
    

    春天

    api:

    @Controller
    @RequestMapping("/user")
    public class UserService {
    
      @RequestMapping(method = RequestMethod.POST, value="/login", headers="Accept=application/json")
      public @ResponseBody Response login(
            @RequestParam(value = "user", defaultValue = "") String email,
            @RequestParam(value = "password", defaultValue = "") String password,
            HttpServletRequest request
            ) {
        // Your logic here
      }
    }
    

    【讨论】:

    • 谢谢!另一件事是如何将域对象与暴露给 API 的对象分开?您将如何对 API 进行版本控制?
    • 通常我会将域对象放在“模型”包中;如果您的 api 有特定对象,请将它们放在 API 的同一包下。对于版本控制,最佳做法是始终以版本名称开头,例如 /api/v1/{myApi}。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2012-05-23
    • 2013-01-14
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多