自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SpringBoot請(qǐng)求參數(shù)還可以這樣玩?很少有人知道?

開發(fā) 前端
對(duì)于application/json類型的數(shù)據(jù),客戶端通常會(huì)將請(qǐng)求的內(nèi)容以JSON格式添加到HTTP請(qǐng)求的body中,并設(shè)置請(qǐng)求的Content-Type為application/json。在SpringBoot后端,當(dāng)處理這種類型的數(shù)據(jù)時(shí),我們只需在控制器方法的相應(yīng)參數(shù)上使用@RequestBody注解,SpringBoot便會(huì)自動(dòng)將請(qǐng)求體中的JSON數(shù)據(jù)轉(zhuǎn)換成Java對(duì)象(如DTO、VO等)。

環(huán)境:Spring2.7.18

1. 簡(jiǎn)介

在Web開發(fā)中,請(qǐng)求參數(shù)處理是核心功能之一。SpringBoot提供了靈活且強(qiáng)大的參數(shù)綁定機(jī)制,能夠自動(dòng)將HTTP請(qǐng)求中的參數(shù)(如查詢參數(shù)、路徑變量、表單數(shù)據(jù)、JSON等)映射到控制器方法的參數(shù)上。無論是簡(jiǎn)單類型、復(fù)雜對(duì)象還是集合類型,SpringBoot都能通過注解(如@RequestParam、@PathVariable、@RequestBody等)實(shí)現(xiàn)無縫對(duì)接,極大地提升了開發(fā)效率與應(yīng)用的健壯性。此外,它還支持?jǐn)?shù)據(jù)校驗(yàn)、自定義參數(shù)解析器等高級(jí)特性,滿足各種復(fù)雜的業(yè)務(wù)需求。對(duì)于表單數(shù)據(jù),當(dāng)設(shè)置Content-Type為multipart/form-data時(shí),我們確實(shí)可以方便地實(shí)現(xiàn)文件的上傳以及普通文本字段的提交。然而,在某些復(fù)雜場(chǎng)景中,我們可能希望除了上傳文件外,還能將其他字段以非普通文本類型(如application/json、application/xml等)提交,這種場(chǎng)景又該如何實(shí)現(xiàn)呢?

對(duì)于application/json類型的數(shù)據(jù),客戶端通常會(huì)將請(qǐng)求的內(nèi)容以JSON格式添加到HTTP請(qǐng)求的body中,并設(shè)置請(qǐng)求的Content-Type為application/json。在SpringBoot后端,當(dāng)處理這種類型的數(shù)據(jù)時(shí),我們只需在控制器方法的相應(yīng)參數(shù)上使用@RequestBody注解,SpringBoot便會(huì)自動(dòng)將請(qǐng)求體中的JSON數(shù)據(jù)轉(zhuǎn)換成Java對(duì)象(如DTO、VO等)。

接下來我詳細(xì)的介紹對(duì)于這種復(fù)雜的應(yīng)用場(chǎng)景在SpringBoot中是如何進(jìn)行處理的,這需要前后端配合。

2. 實(shí)戰(zhàn)案例

既然要包含json對(duì)象,又要包含附近,所以這里我們需要結(jié)合@RequestPart注解,用該注解分別來指定要獲取請(qǐng)求中哪部分內(nèi)容,而Spring MVC底層會(huì)更加你的類型進(jìn)行自動(dòng)的轉(zhuǎn)換。

2.1 基本操作

接口定義

@PostMapping("/requestpart")
public Object requestpart(
    @RequestPart("user") User user, 
    @RequestPart("file") MultipartFile file
  ) throws Exception {
  // TODO
  file.transferTo(new File("f://m.png")) ;
  return user ;
}

這里每個(gè)參數(shù)都通過@RequestPart來指定分別獲取請(qǐng)求中的哪部分內(nèi)容。接口定義完后,接下來看前端要如何處理

前端請(qǐng)求處理

前端我們需要借助FormData來添加每一項(xiàng)表單數(shù)據(jù),同時(shí)還需要為每一項(xiàng)指明你的數(shù)據(jù)類型,如下示例:

let form = new FormData()
// 文件附件
form.append('file', document.querySelector('#file').files[0])
let data = {age: 5000, name: '中國(guó)????'}
// 通過Blob來構(gòu)建一個(gè)不可變、原始數(shù)據(jù)的類文件對(duì)象,同時(shí)指明你數(shù)據(jù)類型
let user = new Blob([JSON.stringify(data)], { type: 'application/json' })
form.append('user', user)
axios({
  method: 'post',
  url: 'http://localhost:8080/api/request/requestpart',
  // 設(shè)置請(qǐng)求header,這里設(shè)置multipart/mixed也可以
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  data: form
})

粗糙的前端頁面

圖片圖片

后端接口成功的接收了json數(shù)據(jù),再看看請(qǐng)求長(zhǎng)什么樣。

圖片圖片

通過請(qǐng)求Payload知道,每個(gè)請(qǐng)求部分都有自己的Content-Type。在后端接口會(huì)根據(jù)每個(gè)Content-Type進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。

2.2 更多請(qǐng)求類型

你還可以指定更多的類型。

public Object requestpart(
    @RequestPart("user") User user, 
    @RequestPart("xml") String xml, 
    @RequestPart("file") MultipartFile file)

前端通過通過Blob對(duì)象來指定數(shù)據(jù)類型。

let form = new FormData()
// other
// 制定類型為xml
let xml = new Blob(['<message><title>@RequestPart請(qǐng)求參數(shù)處理</title></message>'], {type: 'application/xml'})
form.append('xml', xml)

請(qǐng)求情況。

圖片圖片

如果你還有其它類型,可以任意的指定,只要后端有對(duì)應(yīng)的參數(shù)解析器即可(后端如何轉(zhuǎn)換類型會(huì)根據(jù)你請(qǐng)求的情況比如:根據(jù)Content-Type)。

2.3 參數(shù)校驗(yàn)

與@RequestBody請(qǐng)求參數(shù)一樣,這里的@RequestPart也可以使用基于注解的方式進(jìn)行參數(shù)的校驗(yàn),如下示例:

@PostMapping("/requestpart")
public Object requestpart(
    @Validated @RequestPart("user") User user,
    BindingResult result,
    @RequestPart(name = "xml", required = false) String xml, 
    @RequestPart("file") MultipartFile file
  ) throws Exception {
  // TODO
  if (result.hasErrors()) {
    return result.toString() ;
  }
  return user ;
}
// User實(shí)體對(duì)象
public static class User {
  private Integer age ;
  @NotEmpty
  private String name ;
  // Getters, Setters
}

前端輸出結(jié)果;

圖片圖片

注意:請(qǐng)求錯(cuò)誤對(duì)象的位置,否則將在后端控制臺(tái)拋出異常,當(dāng)然如果你有全局異常處理也就無所謂了。

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-06-13 08:19:08

Controller接口參數(shù)

2019-01-29 10:00:59

GitHub開源搜索

2024-05-17 09:37:26

format屬性Spring

2021-03-03 08:05:53

C++項(xiàng)目函數(shù)

2022-12-06 17:30:04

2016-09-29 17:48:32

騰訊云語音質(zhì)檢珍愛網(wǎng)

2021-02-01 13:35:28

微信Python技巧

2022-07-30 23:45:09

內(nèi)存泄漏檢測(cè)工具工具

2019-10-30 12:24:57

網(wǎng)絡(luò)安全安全風(fēng)險(xiǎn)網(wǎng)絡(luò)攻擊

2022-09-26 07:32:24

開發(fā)接口編程

2022-08-21 14:00:11

消息中間件MQ

2022-05-17 07:26:33

動(dòng)畫CSS前端

2023-07-03 16:49:47

5G

2021-02-04 13:32:55

jsp技術(shù)servlet

2012-10-12 10:13:26

eclips代碼編寫Editplus

2013-09-18 10:44:01

搜狗輸入法詞語

2017-11-27 12:24:02

命令行代碼指令

2013-08-22 10:28:50

.NET MVC.NETRazor

2020-08-24 07:19:13

主鍵自增數(shù)據(jù)庫

2020-07-09 08:37:13

ES6
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)