在 Java 中提供 RESTful JSON API
Posted
技术标签:
【中文标题】在 Java 中提供 RESTful JSON API【英文标题】:Providing RESTful JSON API in Java 【发布时间】:2013-06-09 15:33:32 【问题描述】:的惯用方式是什么?您是否使用 JAX-WS 和 XML 注释(@XmlElement 等)?您如何将带注释的对象序列化为 JSON(使用 Jackson 或类似库)?如何将域对象与发送到 API 的对象分开?
我了解 Java,希望您能向我指出有关这些主题的良好资源和最佳实践。
谢谢!
【问题讨论】:
JAX-WS 是关于 SOAP,JAX-RS 是关于 REST。 也许“jersey”是一个不错的关键字。 @Tichodroma 谢谢,Java 世界里有这么多首字母缩略词 :) @Fildor 我采用了一个尝试提供 REST API 的项目。但是,在我看来,它并没有解决问题,它需要重构。我试图寻求该领域的最佳实践。 在我的答案中添加了一些代码。 :) 【参考方案1】:我会简单地使用Play 来节省我已经完成的大量工作。 该链接适用于 Play 1.2,虽然当前版本是 2.1,但它也应该适合该版本。
【讨论】:
【参考方案2】:我在 Jersey 和 Jackson 方面有很好的经验,甚至在 android、JBoss 或 Tomcat 方面也是如此。见:
http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/ 和 http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
或
An Android REST Client and Tomcat REST Webservice
【讨论】:
我对服务器端感兴趣。客户端不多。 @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。 :)以上是关于在 Java 中提供 RESTful JSON API的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何在java中使用restful api以json格式返回404?
Android入门第10天-Android访问远程Spring Boot提供的Restful API接口
gRPC helloworld service, RESTful JSON API gateway and swagger UI