Spring Boot教學
Spring Boot是什麼?
Spring Boot簡介
Spring Boot主要目標
Spring Boot快速入門
新項目爲什麼需要Spring Boot?
Spring Boot引導過程
Spring Boot核心和限制
Spring Boot Tomcat部署
Spring Boot優點和缺點
Spring Boot構建系統
Spring Boot入門
Spring Boot代碼結構
Spring Boot安裝
Spring Boot Bean和依賴注入
Spring Boot應用程序開發入門
Spring Boot運行器(Runner)
Spring Boot JSP應用實例
Spring Boot應用程序屬性
Spring Boot將WAR文件部署到Tomcat
Spring Boot日誌
Spring Boot Hello World(Thymeleaf)示例
Spring Boot構建RESTful Web服務
Spring Boot非web應用程序實例
Spring Boot異常處理
Spring Boot @ConfigurationProperties實例
Spring Boot攔截器
Spring Boot SLF4J日誌實例
Spring Boot Servlet過濾器
Spring Boot Ajax實例
Spring Boot Tomcat端口號
Spring Boot文件上傳示例(Ajax和REST)
Spring Boot Rest模板
Spring Boot文件上傳示例
Spring Boot文件處理
Spring Boot服務組件
Spring Boot Thymeleaf示例
Spring Boot使用RESTful Web服務
Spring Boot CORS支持
Spring Boot國際化
Spring Boot調度
Spring Boot啓用HTTPS
Spring Boot Eureka服務器
Spring Boost Eureka服務註冊
Spring Boot Zuul代理服務器和路由
Spring Boot雲配置服務器
Spring Boot雲配置客戶端
Spring Boot Actuator
Spring Boot管理服務器
Spring Boot管理客戶端
Spring Boot啓用Swagger2
Spring Boot創建Docker鏡像
Spring Boot跟蹤微服務日誌
Spring Boot Flyway數據庫
Spring Boot發送電子郵件
Spring Boot Hystrix
Spring Boot Web Socket
Spring Boot批量服務
Spring Boot Apache Kafka
Spring Boot單元測試用例
Spring Boot Rest控制器單元測試
Spring Boot數據庫源(連接數據庫)
Spring Boot保護Web應用程序

Spring Boot構建RESTful Web服務

Spring Boot爲爲企業應用程序構建RESTful Web服務提供了非常好的支持。 本章將詳細介紹如何使用Spring Boot構建RESTful Web服務。

注 - 要構建RESTful Web服務,需要將Spring Boot Starter Web依賴項添加到構建配置文件中。

如果是Maven用戶,請使用以下代碼在pom.xml 文件中添加以下依賴項 -

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

如果是Gradle用戶,請使用以下代碼在build.gradle 文件中添加以下依賴項。

compile('org.springframework.boot:spring-boot-starter-web')

完整的構建配置文件Maven build - 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.yiibai</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/> 
   </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-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>

完整的構建配置文件Gradle Build - build.gradle 的代碼如下 -

buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.yiibai'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

在繼續構建RESTful Web服務之前,建議瞭解以下注釋 -

Rest控制器

[@RestController](https://github.com/RestController "@RestController")註釋用於定義RESTful Web服務。它提供JSON,XML和自定義響應。其語法如下所示 -

@RestController
public class ProductServiceController {
}

請求映射

[@RequestMapping](https://github.com/RequestMapping "@RequestMapping")註釋用於定義訪問REST端點的Request URI。可以定義Request方法來使用和生成對象。默認請求方法是:GET

@RequestMapping(value = "/products")
public ResponseEntity<Object> getProducts() { }

請求主體

[@RequestBody](https://github.com/RequestBody "@RequestBody")註釋用於定義請求正文內容類型。

public ResponseEntity<Object> createProduct(@RequestBody Product product) {
}

路徑變量

[@PathVariable](https://github.com/PathVariable "@PathVariable")批註用於定義自定義或動態請求URI。 請求URI中的Path變量定義爲花括號{},如下所示 -

public ResponseEntity<Object> updateProduct(@PathVariable("id") String id) {
}

請求參數

[@RequestParam](https://github.com/RequestParam "@RequestParam")註釋用於從請求URL讀取請求參數。默認情況下,它是必需參數。還可以爲請求參數設置默認值,如下所示 -

public ResponseEntity<Object> getProduct(
   @RequestParam(value = "name", required = false, defaultValue = "honey") String name) {
}

GET API

默認的HTTP請求方法是GET。此方法不需要任何請求主體。可以發送請求參數和路徑變量來自定義或動態URL。
用於定義HTTP GET請求方法的示例代碼如下所示。 在此示例中使用HashMap存儲產品。 請注意,使用POJO類作爲要存儲的產品。
這裏,請求URI是/products,它將從HashMap存儲庫返回產品列表。下面給出了包含GET方法REST端點的控制器類文件。

package com.yiibai.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.yiibai.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);

      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

POST API

HTTP POST請求用於創建資源。 此方法包含請求正文。可以發送請求參數和路徑變量來定義自定義或動態URL。
以下示例顯示了用於定義HTTP POST請求方法的示例代碼。 在此示例中,使用HashMap存儲Product,其中產品是POJO類。
這裏,請求URI是/products,它會在將產品存儲到HashMap存儲庫後返回字符串。

package com.yiibai.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.yiibai.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();

   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productRepo.put(product.getId(), product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }
}

PUT API

HTTP PUT請求用於更新現有資源,此方法包含請求正文。可以發送請求參數和路徑變量來自定義或動態URL。
下面給出的示例顯示瞭如何定義HTTP PUT請求方法。 在此示例中使用HashMap更新現有產品,其中產品是POJO類。
這裏的請求URI是/products/{id},它將產品存儲到HashMap庫後返回String。 請注意,使用路徑變量{id}來定義需要更新的產品ID。

package com.yiibai.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.yiibai.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();

   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }   
}

DELETE API

HTTP刪除請求用於刪除現有資源。此方法不包含任何請求正文。可以發送請求參數和路徑變量來自定義或動態URL。
下面給出的示例顯示瞭如何定義HTTP DELETE請求方法。 在此示例中,使用HashMap刪除現有產品,即POJO類。
請求URI是/products/{id},它將在從HashMap存儲庫中刪除產品後返回字符串。使用路徑變量{id}來定義需要刪除的產品ID。

package com.yiibai.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.yiibai.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();

   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) { 
      productRepo.remove(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }
}

本節提供完整的源代碼集。請遵守以下代碼瞭解其各自的功能 -

Spring Boot主應用程序類 - DemoApplication.java :

package com.yiibai.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

POJO類 - Product.java

package com.yiibai.demo.model;

public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Rest Controller類 - ProductServiceController.java

package com.yiibai.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.yiibai.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();
   static {
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);

      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);
   }

   @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
   public ResponseEntity<Object> delete(@PathVariable("id") String id) { 
      productRepo.remove(id);
      return new ResponseEntity<>("Product is deleted successsfully", HttpStatus.OK);
   }

   @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
   public ResponseEntity<Object> updateProduct(@PathVariable("id") String id, @RequestBody Product product) { 
      productRepo.remove(id);
      product.setId(id);
      productRepo.put(id, product);
      return new ResponseEntity<>("Product is updated successsfully", HttpStatus.OK);
   }

   @RequestMapping(value = "/products", method = RequestMethod.POST)
   public ResponseEntity<Object> createProduct(@RequestBody Product product) {
      productRepo.put(product.getId(), product);
      return new ResponseEntity<>("Product is created successfully", HttpStatus.CREATED);
   }

   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

可以創建一個可執行的JAR文件,並使用下面的Maven或Gradle命令運行spring boot應用程序。
對於Maven,請使用下面顯示的命令 -

mvn clean install

在執行命令之後,看到控制檯輸出"BUILD SUCCESS"之後,在目標目錄下找到JAR文件。對於Gradle,請使用下面顯示的命令 -

gradle clean build

在看到控制檯輸出"BUILD SUCCESSFUL"之後,可以在build/libs目錄下找到JAR文件。使用下面顯示的命令運行JAR文件 -

java –jar <JARFILE>

這將在Tomcat端口8080上啓動應用程序,如下所示 -

Spring

現在點擊POSTMAN應用程序中顯示的URL,查看輸出。

GET API URL爲:http://localhost:8080/products

Spring

GET API URL爲:http://localhost:8080/products

Spring

PUT API URL爲:http://localhost:8080/products/3

Spring

DELETE API URL爲:http://localhost:8080/products/3
Spring

以下是糾正/補充內容:

最後一段出現了兩個GET API接口,雖然影響不是很大但是最好可以修改一下   提交時間:2019-11-01