本篇文章主要介绍了详解使用 Spring Boot 开发 Restful 程序, 具有一定的参考价值, 感兴趣的小伙伴们可以参考一下
一简介
Spring Boot 是由 Pivotal 团队提供的全新框架, 其设计目的是用来简化新 spring 应用的初始搭建以及开发过程该框架使用了特定的方式来进行配置, 从而使开发人员不再需要定义样板化的配置通过这种方式, Boot 致力于在蓬勃发展的快速应用开发领域 (rapid application development) 成为领导者
多年以来, Spring IO 平台饱受非议的一点就是大量的 XML 配置以及复杂的依赖管理在去年的 SpringOne 2GX 会议上, Pivotal 的 CTO Adrian Colyer 回应了这些批评, 并且特别提到该平台将来的目标之一就是实现免 XML 配置的开发体验 Boot 所实现的功能超出了这个任务的描述, 开发人员不仅不再需要编写 XML, 而且在一些场景中甚至不需要编写繁琐的 import 语句在对外公开的 beta 版本刚刚发布之时, Boot 描述了如何使用该框架在 140 个字符内实现可运行的 web 应用, 从而获得了极大的关注度, 该样例发表在 tweet 上
Spring Boot 不生成代码, 且完全不需要 XML 配置其主要目标如下:
为所有的 Spring 开发工作提供一个更快更广泛的入门经验
开箱即用, 你也可以通过修改默认值来快速满足你的项目的需求
提供了一系列大型项目中常见的非功能性特性, 如嵌入式服务器安全指标, 健康检测外部配置等
Spring Boot 官网: http://projects.spring.io/spring-boot/
二开发环境准备
IDE:IntelliJ IDEA
官网地址: https://www.jetbrains.com/idea/download/
JDK:1.8
Maven
数据库: MySQL
我将以一个用户积分系统为例, 开发一个 Restful 风格的服务端
三第一个 Restful 程序
1. 新建一个普通 Maven 工程
创建项目完成后目录结构如下图所示
2. 在 POM 文件中加入对 Spring-Boot 的依赖
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.bluecoffee</groupId>
- <artifactId>mapp</artifactId>
- <version>1.0-SNAPSHOT</version>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.4.1.RELEASE</version>
- <relativePath /> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
3. 新建一个 RestController 来接收客户端的请求, 我们来模拟一个登录请求
- package com.yepit.mapp.rest;
- import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.bind.annotation.*;
- /**
- * Created by qianlong on 16/7/20.
- */
- @RestController
- public class UserController {
- @RequestMapping(value = "/users/{username}",method = RequestMethod.GET,consumes="application/json")
- public String getUser(@PathVariable String username, @RequestParam String pwd){
- return "Welcome,"+username;
- }}
关键字 @RestController 代表这个类是用 Restful 风格来访问的, 如果是普通的 WEB 页面访问跳转时, 我们通常会使用 @Controller
value = "/users/{username}" 代表访问的 URL 是 "http://host:PORT/users / 实际的用户名"
method = RequestMethod.GET 代表这个 HTTP 请求必须是以 GET 方式访问
consumes="application/json" 代表数据传输格式是 json
@PathVariable 将某个动态参数放到 URL 请求路径中
@RequestParam 指定了请求参数名称
4. 新建启动 Restful 服务端的启动类
- package com.yepit.mapp;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- /**
- * Created by qianlong on 16/7/20.
- */
- @SpringBootApplication
- public class MappRunApplication {
- public static void main(String[] args) {
- SpringApplication.run(MappRunApplication.class, args);
- }
- }
5. 执行 MappRunApplication 的 Main 方法启动 Restful 服务, 可以看到控制台有如下输出
- . ____ _ __ _ _
- /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\
- ( ( )\\___ | '_ |'_| | '_ \\/ _` | \\ \\ \\ \\
- \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )
- ' |____| .__|_| |_|_| |_\\__, | $ $
- =========|_|==============|___/=/_/_/_/
- :: Spring Boot :: (v1.3.3.RELEASE)
- 2016-07-20 16:49:43.334 INFO 2106 --- [ main] com.yepit.mapp.MappRunApplication : Starting MappRunApplication on bogon with PID 2106 (/Users/qianlong/workspace/spring-boot-samples/target/classes started by qianlong in /Users/qianlong/workspace/spring-boot-samples)
- 2016-07-20 16:49:43.338 INFO 2106 --- [ main] com.yepit.mapp.MappRunApplication : No active profile set, falling back to default profiles: default
- 2016-07-20 16:49:43.557 INFO 2106 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@543e710e: startup date [Wed Jul 20 16:49:43 CST 2016]; root of context hierarchy
- 2016-07-20 16:49:44.127 INFO 2106 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
- 2016-07-20 16:49:44.658 INFO 2106 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
- 2016-07-20 16:49:44.672 INFO 2106 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
- 2016-07-20 16:49:44.673 INFO 2106 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.32
- 2016-07-20 16:49:44.759 INFO 2106 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
- 2016-07-20 16:49:44.759 INFO 2106 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1207 ms
- 2016-07-20 16:49:44.972 INFO 2106 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
- 2016-07-20 16:49:44.977 INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
- 2016-07-20 16:49:44.978 INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
- 2016-07-20 16:49:44.978 INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
- 2016-07-20 16:49:44.978 INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
- 2016-07-20 16:49:45.184 INFO 2106 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@543e710e: startup date [Wed Jul 20 16:49:43 CST 2016]; root of context hierarchy
- 2016-07-20 16:49:45.251 INFO 2106 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/users],methods=[GET],consumes=[application/json]}" onto public java.lang.String com.yepit.mapp.rest.UserController.getUser(java.lang.String,java.lang.String)
- 2016-07-20 16:49:45.253 INFO 2106 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
- 2016-07-20 16:49:45.254 INFO 2106 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
- 2016-07-20 16:49:45.275 INFO 2106 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
- 2016-07-20 16:49:45.275 INFO 2106 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
- 2016-07-20 16:49:45.306 INFO 2106 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
- 2016-07-20 16:49:45.380 INFO 2106 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
- 2016-07-20 16:49:45.462 INFO 2106 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
- 2016-07-20 16:49:45.467 INFO 2106 --- [ main] com.yepit.mapp.MappRunApplication : Started MappRunApplication in 2.573 seconds (JVM running for 3.187)
我们可以看到服务器是 Tomcat, 端口为 8080
6. 验证
推荐大家使用 Google 的 Postman 插件来模拟请求
在发起请求前, 请注意需要在 Headers 中设置 Content-Type 为 application/json
到此一个基本的 Restful 风格的服务端就已经完成了, 全部编码时间不会超过 5 分钟!
来源: http://www.phperz.com/article/18/0320/356864.html