使用 Spring Boot 構建 RESTful API

来源:https://www.cnblogs.com/cloudfloating/archive/2019/11/01/11774749.html
-Advertisement-
Play Games

使用 Spring Boot 構建 RESTful Web API ...


1. 使用 Idea 創建 Spring Initializer 項目

Create_Spring_Boot_Project

在創建項目的對話框中添加 Web 和 Lombok,或者建立項目後在 pom.xml 中添加依賴:

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

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2. 使用註解構建 RESTful API

此處沒有使用資料庫,用 ArrayList 作為操作對象。

創建一個實體類,作為 API 操作的對象

package top.cloudli.demo.model;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Character {
    private int id;
    private String name;
    private String racial;
    private String[] ability;
}

這裡使用了 lombok,省去了編寫 Getter、Setter 以及構造函數,添加相應的註解後 lombok 會自動生成。

創建 Controller,實現 RESTful API

@RestController 相當於 @Controller@ResponseBody 的組合,使用該註解後,MIME 預設為 application/json

@GetMapping 相當於 @RequestMapping(method = {RequestMethod.GET}),其他註解類似。

package top.cloudli.demo.controller;

import org.springframework.web.bind.annotation.*;
import top.cloudli.demo.model.Character;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * CRUD for Character
 */
@RestController
@RequestMapping(path = "/character")
public class CharacterController {

    private ArrayList<Character> characters = (ArrayList<Character>) Stream.of(
            new Character(1, "羅小黑", "妖精", new String[]{"空間系-傳送", "空間系-領域"}),
            new Character(2, "羅小白", "人類", null)
    ).collect(Collectors.toList());

    /**
     * 獲取所有 Character
     * @return All Characters
     */
    @GetMapping()
    public List<Character> getCharacters() {
        return characters;
    }

    /**
     * 根據 id 獲取 Character
     * @param id Id of Character
     * @return Character
     */
    @GetMapping(path = "{id}")
    public Character getCharacter(@PathVariable int id) {
        return characters.stream()
                .filter(character -> character.getId() == id)
                .findAny()
                .orElse(null);
    }

    /**
     * 更新 Character
     * @param character Changed Character
     * @return Updated Character
     */
    @PutMapping()
    public Character alterCharacter(@RequestBody Character character) {
        AtomicBoolean found = new AtomicBoolean(false);

        characters.replaceAll(c -> {
            if (c.getId() == character.getId()) {
                found.set(true);
                return character;
            } else return c;
        });

        return found.get() ? character : null;
    }

    /**
     * 添加 Character
     * @param character New Character
     * @return Inserted Character
     */
    @PostMapping()
    public Character addCharacter(@RequestBody Character character) {
        return characters.add(character) ? character : null;
    }

    /**
     * 刪除 Character
     * @param id Id of Character
     * @return Id of Character deleted
     */
    @DeleteMapping(path = "{id}")
    public int deleteCharacter(@PathVariable int id) {
        return characters.removeIf(character -> character.getId() == id) ? id : -1;
    }
}

3. 運行項目,訪問 API

URL 方法 操作
/character GET 獲取所有的 Character
/character/id GET 獲取指定 id 的 Character
/character PUT 修改 Character,傳遞修改後的完整對象
/character/id DELETE 刪除指定 id 的 Character

如果使用 ?id=xxx 的方式,可以將註解中的 path 參數去掉。

發送 GET 請求到 http://localhost:8080/character

[
    {
        "id": 1,
        "name": "羅小黑",
        "racial": "妖精",
        "ability": [
            "空間系-傳送",
            "空間系-領域"
        ]
    },
    {
        "id": 2,
        "name": "羅小白",
        "racial": "人類",
        "ability": null
    }
]

發送 GET 請求到 http://localhost:8080/character/1

{
    "id": 1,
    "name": "羅小黑",
    "racial": "妖精",
    "ability": [
        "空間系-傳送",
        "空間系-領域"
    ]
}

DELETE 請求與上面的 GET 一樣,成功後指定 id 的 Character 將被刪除,返回刪除的 id。

發送 PUT 請求到 `http://localhost:8080/character,向 Header 添加 Content-Type:application/json,Body 部分為 修改後的完整數據:

{
    "id": 1,
    "name": "小黑",
    "racial": "妖精",
    "ability": [
        "空間系-傳送"
    ]
}

成功後將返回與上面一樣的 JSON 數據。

POST 請求與前面的 PUT 一樣,成功後返回提交的數據。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天我們來畫折線圖 效果圖 以下為模擬數據 首先創建filterData方法 用於過濾數據 text文本 line線段 area圓 tag暫時用不到 今天說的是折線所以創建zrLine 方法 我們在新增一個文件夾創建utli.js這個文件夾的作用為我們把創建線創建圓的公共方法寫在這個js文件里 ut ...
  • 放到我自己的伺服器上了。 網 scale.html 櫻花 sakura.html ...
  • 本技巧來自這篇文章 -- How to animate box-shadow with silky smooth performance 本文不是直譯,因為覺得這個技巧很有意思很有用,遂起一文。 box-shadow 在我們的工作中使用以及越來越多,伴隨陰影的動畫或多或少都有一點。假設,我們有下麵這 ...
  • 2019杭州雲棲大會上,高德地圖技術團隊向與會者分享了包括視覺與機器智能、路線規劃、場景化/精細化定位時空數據應用、億級流量架構演進等多個出行技術領域的熱門話題。現場火爆,聽眾反響強烈。我們把其中的優秀演講內容整理成文並陸續發佈出來,本文為其中一篇。 阿裡巴巴資深技術專家孫蔚在高德技術專場做了題為《 ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
  • Java 程式員第一個要瞭解的基礎概念就是: "什麼是面向對象編程(OOP)" ? 玩過 DOTA2 (一款推塔殺人的游戲)嗎?裡面有個齊天大聖的角色,歐洲戰隊玩的很溜,國內戰隊卻不怎麼會玩,自家人不會玩自家的神話英雄,實在有點悲哀。 我們用 Java 定義一個孫悟空的類吧: 我們給他兩個屬性(生命 ...
  • 這篇文章主要簡單的介紹下 Nginx 的相關知識,主要包括以下幾部分內容: 1. Nginx 適用於哪些場景? 2. 為什麼會出現 Nginx? 3. Nginx 優點 4. Nginx 的編譯與配置 Nginx 適用於哪些場景? 如圖所示,一個請求會先經過 Nginx 到達應用服務層,然後再去訪問 ...
  • Date 10.06 pm Point 完成beanfactory中單例bean的初始化 beanFactory.preInstantiateSingletons() 1. 拿到所有的bean定義信息(在 中,遍歷list 2. 獲取到bean的定義信息 3. 如果這個bean不是抽象,是單例,不是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...