使用SpringBoot編寫Restful風格接口

一、簡介

    Restful是一種對url進行規範的編碼風格,通常一個網址對應一個資源,訪問形式類似http://xxx.com/xx/{id}/{id}。

    舉個栗子,當我們在某購物網站上買手機時會有很多品牌選擇,而每種品牌下又有很多型號,那麼https://mall.com/mobile/iphone/6 代表了Iphone6,https://mall.com/mobile/iphone/7和https://mall.com/mobile/iphone/8分別代表了Iphone7和Iphone8。

    SpringBoot內置了SpringMvc中,也提供了@RequestParam, @RequestBody和@PathVariable 三個註解獲取客戶端參數,其中前兩者獲取的是客戶端post提交的參數,而@PathVariable 則是從訪問url中獲取參數。
    言歸正傳,下面我們以用戶管理系統爲例,在SpringBoot中編寫一組Restful風格的接口吧。

二、開發環境

  • IDE:IntelliJ IDEA
  • 官網地址:https://www.jetbrains.com/idea/download/
  • JDK:1.8
  • 數據庫:MySQL
  • 構建工具:Maven

三、編寫自己的Restful程序

1.創建SpringBoot項目,如下圖所示:


點擊Next,選擇一些基本項目參數,如下圖:



點擊Next,選擇我們需要的組件,這裏我們選擇MySQL,JPA,WEB組件作爲我們開發組件。如下圖所示:



點擊Finish即完成項目的創建,項目結構如下圖:


2.項目依賴Maven配置pom.xml如下:

<?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.forMelo</groupId>
	<artifactId>myrestfulproject</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<name>myrestfulproject</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<!--<scope>provided</scope>-->
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

3.數據源、JPA配置

SpringBoot默認配置文件爲application.properties,我們將其修改爲application.yml格式,.yml屬性文件層次感和可讀性更強。application.yml具體配置如下:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
    driverClassName: com.mysql.jdbc.Driver
    username: root
    password: 1
  jpa:
    database: MySQL
    show-sql: true
    hibernate:
      ddl-auto: update
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy

下面我們在mysql中創建test數據庫,使用SQLyog創建表t_user_info,如下圖所示:


4.編寫控制器UserController.java和實體類User.java

UserController.java

package com.formelo.controller;

import com.formelo.entity.User;
import com.formelo.repository.UserJPARepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * Created by songqiuming on 2018/1/7.
 */
@RestController
public class UserController {

    @Autowired
    private UserJPARepository userJPARepository;

    /**
     * 查詢用戶列表
     * @return
     */
    @GetMapping(value = "/user")
    public List<User> findUserList(){
        return userJPARepository.findAll();
    }

    /**
     * 根據Id查詢一個用戶
     * @param id
     * @return
     */
    @GetMapping(value = "/user/query/{id}")
    public User findUserOne(@PathVariable("id") Integer id){
        return userJPARepository.findOne(id);
    }

    /**
     * 添加用戶
     * @param name
     * @param age
     * @param country
     * @return
     */

    @PostMapping(value = "/user")
    public User addUser(@RequestParam("name") String name, @RequestParam("age") int age,
                        @RequestParam("country") String country){
        User user = new User();
        user.setName(name);
        user.setAge(age);
        user.setCountry(country);
        return userJPARepository.save(user);
    }

    /**
     * 刪除用戶
     * @param id  用戶編號
     * @return
     */
    @DeleteMapping(value = "/user/{id}")
    public  List<User> deleteUser(@PathVariable("id") Integer id){
        userJPARepository.delete(id);
        return userJPARepository.findAll();
    }

    /**
     * 更新用戶
     * @param id
     * @param name
     * @param age
     * @param country
     * @return
     */
    @PutMapping(value = "/user/{id}")
    public User updateUser(@PathVariable("id") Integer id, @RequestParam("name") String name,
                           @RequestParam("age") int age, @RequestParam("country") String country){
        User user = userJPARepository.findById(id);
        user.setName(name);
        user.setAge(age);
        user.setCountry(country);
        return userJPARepository.save(user);
    }

    /**
     * 根據國家查詢用戶
     * @param country
     * @return
     */
    @GetMapping(value = "/user/{country}")
    public List<User> findByCountry(@PathVariable("country") String country){
        return userJPARepository.findByCountry(country);
    }

}


User.java

package com.formelo.entity;

import javax.persistence.*;

/**
 * Created by songqiuming on 2018/1/7.
 */
@Entity
@Table(name = "t_user_info")
public class User {

    private static final long serialVersionUID = -3039703447657705408L;

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name="age")
    private int age;
    @Column(name="country")
    private String country;

    public User() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", country='" + country + '\'' +
                '}';
    }
}

5.創建JPA 

創建UserJPARepository.java,它繼承SpringDataJPA內的JpaRepository接口,實現與數據庫的交互。

UserJPARepository.java

package com.formelo.repository;

import com.formelo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
 * Created by songqiuming on 2018/1/7.
 */
public interface UserJPARepository extends JpaRepository<User,Long> {
    User findById(Long id);
    List<User> findByCountry(String country);
}

6.啓動項目

到處爲止,我們已經完成一組restful風格接口的編碼,運行MyrestfulprojectApplication的main方法,啓動項目,控制檯輸出:

"C:\Program Files\Java\jdk1.8.0_102\bin\java" ...
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.9.RELEASE)

2018-01-09 21:57:41.533  INFO 6884 --- [           main] com.formelo.MyrestfulprojectApplication  : Starting MyrestfulprojectApplication on DESKTOP-6SJA93T with PID 6884 (D:\myproject\myrestfulproject\target\classes started by songqiuming in D:\myproject\myrestfulproject)
2018-01-09 21:57:41.560  INFO 6884 --- [           main] com.formelo.MyrestfulprojectApplication  : No active profile set, falling back to default profiles: default
2018-01-09 21:57:41.763  INFO 6884 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65466a6a: startup date [Tue Jan 09 21:57:41 CST 2018]; root of context hierarchy
2018-01-09 21:57:47.897  INFO 6884 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-01-09 21:57:47.969  INFO 6884 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2018-01-09 21:57:47.972  INFO 6884 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.23
2018-01-09 21:57:48.358  INFO 6884 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-01-09 21:57:48.359  INFO 6884 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 6609 ms
2018-01-09 21:57:48.663  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-01-09 21:57:48.669  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-01-09 21:57:48.670  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-01-09 21:57:48.670  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-01-09 21:57:48.670  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-01-09 21:57:49.598  INFO 6884 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2018-01-09 21:57:49.656  INFO 6884 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
	name: default
	...]
2018-01-09 21:57:49.817  INFO 6884 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.12.Final}
2018-01-09 21:57:49.819  INFO 6884 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2018-01-09 21:57:49.820  INFO 6884 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2018-01-09 21:57:49.976  INFO 6884 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
2018-01-09 21:57:51.225  INFO 6884 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2018-01-09 21:57:52.092  INFO 6884 --- [           main] org.hibernate.tool.hbm2ddl.SchemaUpdate  : HHH000228: Running hbm2ddl schema update
2018-01-09 21:57:52.229  INFO 6884 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-01-09 21:57:53.483  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65466a6a: startup date [Tue Jan 09 21:57:41 CST 2018]; root of context hierarchy
2018-01-09 21:57:53.666  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user],methods=[POST]}" onto public com.formelo.entity.User com.formelo.controller.UserController.addUser(java.lang.String,int,java.lang.String)
2018-01-09 21:57:53.667  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{country}],methods=[GET]}" onto public java.util.List<com.formelo.entity.User> com.formelo.controller.UserController.findByCountry(java.lang.String)
2018-01-09 21:57:53.669  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[DELETE]}" onto public java.util.List<com.formelo.entity.User> com.formelo.controller.UserController.deleteUser(java.lang.Long)
2018-01-09 21:57:53.669  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[GET]}" onto public com.formelo.entity.User com.formelo.controller.UserController.findUserOne(java.lang.Long)
2018-01-09 21:57:53.670  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[PUT]}" onto public com.formelo.entity.User com.formelo.controller.UserController.updateUser(java.lang.Long,java.lang.String,int,java.lang.String)
2018-01-09 21:57:53.670  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user],methods=[GET]}" onto public java.util.List<com.formelo.entity.User> com.formelo.controller.UserController.findUserList()
2018-01-09 21:57:53.673  INFO 6884 --- [           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)
2018-01-09 21:57:53.674  INFO 6884 --- [           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)
2018-01-09 21:57:53.761  INFO 6884 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-01-09 21:57:53.762  INFO 6884 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-01-09 21:57:53.945  INFO 6884 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-01-09 21:57:54.419  INFO 6884 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-01-09 21:57:54.520  INFO 6884 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-01-09 21:57:54.525  INFO 6884 --- [           main] com.formelo.MyrestfulprojectApplication  : Started MyrestfulprojectApplication in 14.573 seconds (JVM running for 16.939)

7.接口測試

下面我們打開postman測試接口。首先,往數據庫裏插入幾條數據,對應的請求如下:

  • 查詢用戶列表:



  • 根據ID查詢一個用戶:



  • 添加用戶:




  • 更新用戶:



  • 刪除用戶:



從上圖可以看到,刪除id=6的記錄後,會自動讀取用戶列表。


  • 根據國家查詢用戶:

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章