Springcloud 學習筆記09-常用注解01 @PostMapping、@GetMapping、@RequestMapping、@RestController、@ResponseBody、@RequestParam、@RequestPart、@PutMapping


1.org.springframework.web.bind.annotation包下注解

1.1 @PostMapping、@GetMapping、@RequestMapping、@RestController、@ResponseBody、@RequestParam、@RequestPart、@PutMapping

(1)@RequestMapping

@RequestMapping如果沒有指定請求方式,將接收Get、Post、Head、Options等所有的請求方式.

(2)@GetMapping

@GetMapping是一個組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫。該注解將HTTP Get 映射到 特定的處理方法上。

get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到

get是從服務器上獲取數據。

若符合下列任一情況,則用GET方法:

* 請求是為了查找資源,HTML表單數據僅用來幫助搜索。
* 請求結果無持續性的副作用。
* 收集的數據及HTML表單內的輸入字段名稱的總長不超過1024個字符。

(3)@PostMapping

@PostMapping是一個組合注解,是@RequestMapping(method = RequestMethod.POST)的縮寫。

get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;

post是向服務器傳送數據。

若符合下列任一情況,則用POST方法:

* 請求的結果有持續性的副作用,例如,數據庫內添加新的數據行。
* 若使用GET方法,則表單上收集的數據可能讓URL過長。
* 要傳送的數據不是采用7位的ASCII編碼。

(4)@requestBody(后端方法接收請求體)

@requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。

 @RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);

 后端代碼接收測試截圖:

(5)@RequestParam(后端方法接收請求參數)

注解@RequestParam接收的參數是來自requestHeader中,即請求頭通常用於GET請求,比如常見的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完結,其在Controller 層的寫法如下圖所示:

@RequestParam有三個配置參數:

  • required 表示是否必須,默認為 true,必須。
  • defaultValue 可設置請求參數的默認值。
  • value 為接收url的參數名(相當於key值)。

@RequestParam也可用於其它類型的請求,例如:POST、DELETE等請求

 @RequestParam接收參數,要求postman以表單的格式發送數據(即使用form-data)

(6)@RequestPart

@RequestPart這個注解用在multipart/form-data表單提交請求的方法上。多用於文件上傳場景

前台請求:
jsonDataPerson對象的json字符串
uploadFile為上傳的圖片
在這里插入圖片描述

(7)@PutMapping

和PostMapping作用等同,都是用來向服務器提交信息。如果是添加信息,傾向於用@PostMapping,如果是更新信息,傾向於用@PutMapping。兩者差別不是很明顯。

(8)@RestController

@RestController = @Controller + @ResponseBody組成,等號右邊兩位同志簡單介紹兩句,就明白我們@RestController的意義了:

  • @Controller 將當前修飾的類注入SpringBoot IOC容器,使得從該類所在的項目跑起來的過程中,這個類就被實例化。當然也有語義化的作用,即代表該類是充當Controller的作用
  • @ResponseBody 它的作用簡短截說就是指該類中所有的API接口返回的數據,甭管你對應的方法返回Map或是其他Object,它會以Json字符串的形式返回給客戶端,本人嘗試了一下,如果返回的是String類型,則仍然是String。

總之,用@Controller,返回的是頁面;@Controller加上@ResponseBody,返回的是JSON、XML或其他文本。

用@RestController,意味着這個Controller的所有方法上面都加了@ResponseBody,不論你在每個方法前加、或不加@ResponseBody,都一樣。所以這種Controller不會返回頁面。

@Controller
@RequestMapping("/test")
public class MyController1 {
    
    @ResponseBody
    @GetMapping(path="/get1", produces = "text/plain;charset=utf-8")
    public String getMethod1(String str) {
        return str;
    }

    @GetMapping(path="/get2", produces = "text/plain;charset=utf-8")
    public String getMethod2(String str) {
        return str;
    }
}
訪問 /test/get1,並攜帶參數 str="index" ,返回 index 字符串。
訪問 /test/get2,並攜帶參數 str="index" ,返回名為 index 頁面,如index.jsp。
 

1.2 案例分析

案例一:

package com.ttbank.flep.file.controller;

import com.ttbank.flep.file.entity.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Api("用戶信息管理")
@RestController
@RequestMapping("/user/*")
public class UserController {

    private final static List<User> userList = new ArrayList<>();

    {
        userList.add(new User(1, "Tom", "A fool cat"));
        userList.add(new User(2, "Jerry", "A clever mouse"));
    }

    @ApiOperation("獲取用戶列表")
    @GetMapping("list")
    public List userList() {
        return userList;
    }

    @ApiOperation("新增用戶")
    @PostMapping("add")
    public boolean add(User user) {
        return userList.add(user);

    }

    @ApiOperation("更新用戶")
    @ApiImplicitParam(name = "user", value = "單個用戶信息", dataType = "User")
    @PutMapping("update")
    public boolean update(User user) {
        return userList.remove(user) && userList.add(user);
    }

    @ApiOperation("批量刪除用戶")
    @ApiImplicitParam(name = "users", value = "N個用戶信息", dataType = "List<User>")
    @DeleteMapping("delete")
    public boolean delete(@RequestBody List<User> users) {
        return userList.removeAll(users);
    }
}

(1)利用PostMan訪問,進行一個add添加操作,http://127.0.0.1:7003/flep/file/user/add

(2)利用PostMan訪問,進行一個list添加操作,http://127.0.0.1:7003/flep/file/user/list

案例二:

通過@requestBody可以將請求體中的JSON字符串綁定到相應的bean上,當然,也可以將其分別綁定到對應的字符串上。

  $.ajax({
        url:"/login",
        type:"POST",
        data:'{"userName":"admin","pwd","admin123"}',
        content-type:"application/json charset=utf-8",
        success:function(data){
          alert("request success ! ");
        }
    });

    @requestMapping("/login")
    public void login(@requestBody String userName,@requestBody String pwd){
      System.out.println(userName+" :"+pwd);
    }

這種情況是將JSON字符串中的兩個變量的值分別賦予了兩個字符串,但是呢假如我有一個User類,擁有如下字段:
      String userName;
      String pwd;
那么上述參數可以改為以下形式:@requestBody User user 這種形式會將JSON字符串中的值賦予user中對應的屬性上
需要注意的是,JSON字符串中的key必須對應user中的屬性名,否則是請求不過去的。

 

參考文獻:https://blog.csdn.net/justry_deng/article/details/80972817(推薦閱讀)

https://cloud.tencent.com/developer/article/1414464

https://blog.csdn.net/qq_47443027/article/details/114696716(推薦閱讀)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM