" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot RESTful風(fēng)格入門講解

 更新時(shí)間:2022年11月10日 16:09:43   作者:填丶涂  
RESTful是一種web軟件風(fēng)格,它不是標(biāo)準(zhǔn)也不是協(xié)議,它不一定要采用,只是一種風(fēng)格,它倡導(dǎo)的是一個(gè)資源定位(url)及資源操作的風(fēng)格,這篇文章主要介紹了SpringBoot使用RESTful接口

1、Restful簡介

Restful比較熱門,,Spring的微服務(wù)是基于Restful風(fēng)格搭建的框架。

Restful有一下幾個(gè)特點(diǎn):

  • 使用URL描述資源。
  • 使用HTTP方法描述行為,使用HTTP狀態(tài)碼來表示不同的結(jié)果。
  • 使用JSON交互數(shù)據(jù)。
  • Restful只是一種風(fēng)格,不是強(qiáng)制標(biāo)準(zhǔn)。

2、查詢用戶以及用戶詳情

最簡單的,最常用的GET請求,用于查詢?nèi)繑?shù)據(jù)或者其中一條數(shù)據(jù)的詳情。

2.1常用注解

常用注解作用
@RestController表明此tController 提供的是Restful服務(wù)
@RequestMapping將URL映射到Java
@RequestParam映射請求參數(shù)到Java上的參數(shù)
@PageableDefault指定分頁參數(shù)的默認(rèn)值

2.2查詢用戶詳情

@RequestMapping(value="/manage", method= {RequestMethod.GET})
	public String list(String userId,Map<String,Object> map) {
		if(userId==""||userId==null) {
			map.put("userList", userService.getUserList());
		}else {
			map.put("userList",userService.getUserById(Integer.parseInt(userId)));
		}
		return "user/list";
	}

3、處理創(chuàng)建請求

3.1@RequestBody注解

3.1.1用途

用于接收前端傳遞給后端的json字符串中的數(shù)據(jù)。(處理json格式的數(shù)據(jù))

@RequestBody用來接收前端傳遞給后端的json字符串中的數(shù)據(jù),GET方式的請求一般通過URL中攜帶key-value參數(shù),而@RequestBody接收的是請求體中的數(shù)據(jù)(json格式的數(shù)據(jù),只有請求體中能保存json),所以使用@RequestBody接收數(shù)據(jù)的時(shí)候必須是POST方式等方式。

@RequestBody與@RequestParam()可以同時(shí)使用,但@RequestBody最多只能有一個(gè),而@RequestParam()可以多個(gè)。

3.1.2語法規(guī)范

(@RequestBody Map map)
(@RequestBody Object object)

(@RequestBody Map map)先對簡單,將json解析成Map形式的key-value對,直接通過map.get(“KeyName”)就能拿到值了

(@RequestBody Object object) 通過json字符串中的key來匹配對應(yīng)實(shí)體類的屬性如果匹配一致且json中的該key對應(yīng)的值符合實(shí)體類的對應(yīng)屬性的類型要求時(shí),會調(diào)用實(shí)體類的setter方法將值注入到該屬性。

例如

public Result deleteBookById(@RequestBody HashMap<String, String> map) {
        this.bookService.deleteBookById(Long.parseLong(map.get("id")));
        return Result.createWithSuccessMessage();
    }
public Result updateBookById(@RequestBody Book book){
        Book record = this.bookService.updateBookById(book);
        return Result.createWithModel(record);
    }

注意:

在(@RequestBody Object object)中,前端POST過來的數(shù)據(jù)會通過反序列數(shù)據(jù)到實(shí)體類中,并且在反序列的過程中會進(jìn)行類型的轉(zhuǎn)換。

在json中應(yīng)該用null來代表空值,如果是"“(空字符串)會判斷為空串,如果實(shí)體類屬性是String類型的,那么接受到的就是”",如果實(shí)現(xiàn)類屬性類型是Integer、Double等類型,那么接收到的就是null。

{
	name:"",
	age:null
}

(@RequestBody Object object)內(nèi)部是通過傳遞過來的數(shù)據(jù)中的Key尋找setter方法,有則調(diào)用,無則不作任何操作(其實(shí)可以設(shè)計(jì))。

如果通過Key匹配到setter方法,但是Value無法轉(zhuǎn)換為對應(yīng)的實(shí)例類屬性的類型時(shí),拋出異常。

3.2日期類型的處理

前端傳入日期格式: yyyy-MM-dd HH:mm:ss,例如:2018-07-09 12:55:12(不使用時(shí)間戳,前后雙方聯(lián)調(diào)時(shí)查看起來更加友好)

后端返回日期格式: yyyy-MM-dd HH:mm:ss,例如:2018-07-09 12:55:12(不使用時(shí)間戳,前后雙方聯(lián)調(diào)時(shí)查看起來更加友好)

后端json序列化、反序列化框架: 定義任何一種高效的json工具都行,例如:Fastjson、Gson、Jackson lib

序列化、反序列化日期格式規(guī)范: pattern=”yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”,除特出場景可以使用pattern=”yyyy-MM-dd”,timezone = “GMT+8”

不要隨意自定義convert處理日期格式以及其他特殊格式轉(zhuǎn)換,應(yīng)該交由基礎(chǔ)框架組或架構(gòu)組統(tǒng)一在框架層面解決,對業(yè)務(wù)開發(fā)透明,或者在有些小公司由Leader或高開來擔(dān)當(dāng)。

3.3BindingResult

	/*
     * 添加用戶,使用@RequestBody將請求體映射到Action方法參數(shù)中
     * 使用@Valid注解驗(yàn)證請求參數(shù)的合法性
     * 使用BindingResult處理校驗(yàn)結(jié)果
     * @param user
     * @param result
     * @return
     */
      @PostMapping("/user")
      public User create(@Valid @RequestBody User user, BindingResult result){
         if(result.hasErrors()){
             result.getAllErrors().stream().forEach(error -> {
                 FieldError fieldError = (FieldError)error;
                 String message = fieldError.getField() + " " + error.getDefaultMessage();
                 System.out.println(message);
             });
             return null;
         }
         System.out.println(user.toString());
         user.setId(5l);
         return user;
     }

4、用戶信息修改與刪除

PUT和DELETE并不復(fù)雜,大家也熟悉,用于對后臺數(shù)據(jù)的更新和刪除。

4.1用戶信息修改

對資源更新的請求方法通常是是PUT,但有時(shí)候也可能是POST。那么問題來了,都是更新資源區(qū)別在哪里?

PUTPOST
在HTTP中PUT被定義為冪等的請求方法而POST則不是
操作是作用于一個(gè)具體資源之上作用于一個(gè)集合資源之上
URL在客戶端確定使用PUTURL在服務(wù)端確定使用POST

比較直觀的是資源URL的不同

4.2案例

前端界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../js/jquery.min.js"></script>
    <script>
        $(function () {
            // 查詢所有
            $('#btn1').click(function () {
                $.get('/employees', function (data) {
                    console.log(data);
                });
            });
            // 查詢一個(gè)
            $('#btn2').click(function () {
                $.get('/employees/10', function (data) {
                    console.log(data);
                });
            });
            // 添加
            $('#btn3').click(function () {
                $.post('/employees', "id=11", function (data) {
                    console.log(data);
                });
            });
            // 修改
            $('#btn4').click(function () {
                $.ajax({
                    url: "/employees",
                    type: "PUT",
                    data: {id: 1, name: "小肥羊", age: 10},
                    success: function (data) {
                        console.log(data);
                    }
                });
            });
            // 刪除
            $('#btn5').click(function () {
                $.ajax({
                    url: "/employees/13",
                    type: "DELETE",
                    data: {id: 1},
                    success: function (data) {
                        console.log(data);
                    }
                });
            });

        });
    </script>
</head>
<body>
<button id="btn1">查詢所有</button>
<button id="btn2">查詢一個(gè)</button>
<button id="btn3">添加</button>
<button id="btn4">修改</button>
<button id="btn5">刪除</button>
</body>
</html>

后端控制器

package com.yy.web.controller;
import com.yy.domain.Employee;
import com.yy.util.JsonResult;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
 * @program: restful-demo
 * @ClassName: EmployeeController
 * @description:
 * @author: YanYang
 * @create: 2021-06-23 15:04
 **/
@RestController
@RequestMapping("employees")
public class EmployeeController {
    /**
     * 2個(gè)接口設(shè)計(jì)都是用相同資源,相同請求方法,此時(shí) SpringMVC 無法識別,
     * 認(rèn)為是同一方法,報(bào)錯(cuò):Ambiguous mapping. [模糊映射]
     *
     * RESTful 解決方案:使用 參數(shù)路徑 方式
     *      具體實(shí)現(xiàn):將參數(shù)作為請求映射路徑一部分,[參與映射路徑區(qū)分]
     *      比如:查詢指定 id 的員工信息接口設(shè)計(jì)
     *      @RequestMapping(value = "/employees/{id}", method = RequestMethod.GET)
     *      其中 "/employees/{id}" 參數(shù)路徑,{id} 就是路徑參數(shù)
     *
     *      訪問該接口時(shí):http:localhost:8080/employees/1  其中 1 是 id 參數(shù)
     *      接口接收路徑參數(shù):使用 @PathVariable,表示將參數(shù)路徑上的參數(shù)解析,并賦值給指定變量
     *      如果路徑參數(shù)與變量名不一致,使用 @PathVariable("eid")明確指定
     *
     */
    // 查詢所有(數(shù)據(jù)是模擬的)
//    @RequestMapping(value = "/employees", method = RequestMethod.GET)
    @GetMapping
    public List<Employee> list() {
        return Arrays.asList(new Employee(1L,"小肥羊", 10), new Employee(2L, "熊大", 11));
    }
    // 查詢單個(gè)(數(shù)據(jù)是模擬的)
//    @RequestMapping(value = "/employees/{id}", method = RequestMethod.GET)
    @GetMapping("/{eid}")
    public Employee queryById(@PathVariable("eid") Long id) {
        System.out.println("查詢單個(gè) = " + id);
        return new Employee(3L, "熊二", 8);
    }
    // 添加(數(shù)據(jù)是模擬的)
//    @RequestMapping(value = "/employees", method = RequestMethod.POST)
    @PostMapping
    public Employee add(@ModelAttribute("employee") Employee employee) {
        System.out.println("添加 = " + employee.getId());
        return employee;
    }
    // 修改(數(shù)據(jù)是模擬的)
//    @RequestMapping(value = "/employees", method = RequestMethod.PUT)
    @PutMapping
    public Employee update(@ModelAttribute("employee") Employee employee) {
        System.out.println("修改 = " + employee.getId());
        employee.setId(employee.getId());
        employee.setName(employee.getName());
        employee.setAge(employee.getAge());
        return employee;
    }
    // 刪除(數(shù)據(jù)是模擬的)
//    @RequestMapping(value = "/employees/{id}", method = RequestMethod.DELETE)
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Long id) {
        System.out.println("刪除 = " + id);
        if (id != null && 1 == id) {
            return "刪除成功";
        }
        return "刪除失敗";
    }
}

到此這篇關(guān)于SpringBoot RESTful接口入門講解的文章就介紹到這了,更多相關(guān)SpringBoot RESTful內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 談?wù)凧ava中對象,類和this,super,static關(guān)鍵字的使用

    談?wù)凧ava中對象,類和this,super,static關(guān)鍵字的使用

    對象:對象是類的一個(gè)實(shí)例,有狀態(tài)和行為。類:類是一個(gè)模板,它描述一類對象的行為和狀態(tài)。本文就來和大家聊聊Java中對象,類和關(guān)鍵字的使用,需要的可以參考一下
    2022-08-08
  • Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例

    Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例

    這篇文章主要介紹了Java swing實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了java基于swing組件實(shí)現(xiàn)計(jì)算器布局與運(yùn)算功能的具體操作技巧,需要的朋友可以參考下
    2017-12-12
  • Java?講解兩種找二叉樹的最近公共祖先的方法

    Java?講解兩種找二叉樹的最近公共祖先的方法

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合,這篇文章主要給大家介紹了關(guān)于Java求解二叉樹的最近公共祖先的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Spring?Boot整合流控組件Sentinel的場景分析

    Spring?Boot整合流控組件Sentinel的場景分析

    Sentinel?提供簡單易用、完善的?SPI?擴(kuò)展接口。您可以通過實(shí)現(xiàn)擴(kuò)展接口來快速地定制邏輯,這篇文章主要介紹了Spring?Boot整合流控組件Sentinel的過程解析,需要的朋友可以參考下
    2021-12-12
  • mybatis定義sql語句標(biāo)簽之delete標(biāo)簽解析

    mybatis定義sql語句標(biāo)簽之delete標(biāo)簽解析

    這篇文章主要介紹了mybatis定義sql語句標(biāo)簽之delete標(biāo)簽解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 如何使用IntelliJ IDEA搭建MyBatis-Plus框架并連接MySQL數(shù)據(jù)庫

    如何使用IntelliJ IDEA搭建MyBatis-Plus框架并連接MySQL數(shù)據(jù)庫

    這篇文章主要介紹了如何使用IntelliJ IDEA搭建MyBatis-Plus框架并連接MySQL數(shù)據(jù)庫,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • 深入理解Java并發(fā)編程之LinkedBlockingQueue隊(duì)列

    深入理解Java并發(fā)編程之LinkedBlockingQueue隊(duì)列

    本文主要介紹了Java并發(fā)編程之LinkedBlockingQueue隊(duì)列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java 算法之希爾排序詳解及實(shí)現(xiàn)代碼

    java 算法之希爾排序詳解及實(shí)現(xiàn)代碼

    這篇文章主要介紹了java 算法之希爾排序詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題

    完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題

    這篇文章主要介紹了完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)

    JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)

    本文主要介紹了JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評論