成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

POST請(qǐng)求和GET請(qǐng)求如何傳遞和接收解析參數(shù)

開(kāi)發(fā) 前端
接口參數(shù)應(yīng)該怎么傳遞是每個(gè)項(xiàng)目應(yīng)該面對(duì)的問(wèn)題,這跟編程語(yǔ)言無(wú)關(guān),今天來(lái)總結(jié)一波常用的接口參數(shù)傳遞方式。

[[345069]]

 1. 前言

接口參數(shù)應(yīng)該怎么傳遞是每個(gè)項(xiàng)目應(yīng)該面對(duì)的問(wèn)題,這跟編程語(yǔ)言無(wú)關(guān),今天來(lái)總結(jié)一波常用的接口參數(shù)傳遞方式。

2. GET 請(qǐng)求

GET 請(qǐng)求一般用來(lái)向服務(wù)器請(qǐng)求獲取數(shù)據(jù)。總體來(lái)說(shuō)目前有兩種傳參風(fēng)格類型。

多參數(shù)拼接

這是我們最常見(jiàn)的傳遞方式,它一般傳參方式如下:

  1. GET /api/v1/user?name=felord.cn&age=18 HTTP/1.1 
  2. Host: localhost:8080 

規(guī)則為:參數(shù)和 URI 之間用問(wèn)號(hào)?隔開(kāi), 參數(shù)鍵值用等號(hào)=連接,然后參數(shù)之間用連接符&拼接起來(lái),如樣例中的name=felord.cn&age=18。在 Spring MVC 中這種參數(shù)可以被對(duì)象接收:

  1. @GetMapping("/user"
  2. public Rest<?> urlEncode(User params) { 
  3.     // params.name = felord.cn 
  4.     // params.age = 18 
  5.     return RestBody.okData(params); 

通過(guò)HttpServletRequest#getParameter(String key)也獲取上述方式攜帶的參數(shù),但是一般這種方式建議在 Servlet Filter 過(guò)濾器使用,而不建議在接口中使用。Spring MVC 攔截器獲取參數(shù)的底層也是該方式實(shí)現(xiàn)的。但是我也發(fā)現(xiàn)很多人在接口中使用此不合理的方式。

另外 URL 的長(zhǎng)度是有限制的,如果 GET 請(qǐng)求包含了過(guò)于復(fù)雜的參數(shù)組合,說(shuō)明業(yè)務(wù)設(shè)計(jì)是有問(wèn)題的。

路徑標(biāo)識(shí)參數(shù)

還有一種方式就是路徑參數(shù),這種參數(shù)是期望獲取數(shù)據(jù)的標(biāo)識(shí),一般為數(shù)據(jù)的唯一標(biāo)識(shí)或者分頁(yè)參數(shù)。例如查詢標(biāo)識(shí)為1的用戶:

  1. GET /api/v1/user/1 HTTP/1.1 
  2. Host: localhost:8080 

查詢第1頁(yè)(每頁(yè)10條)的用戶:

  1. GET /api/v1/users/1/10 HTTP/1.1 
  2. Host: localhost:8080 

在 Spring MVC 中這種參數(shù)需要通過(guò)@PathVariable來(lái)處理:

  1. @GetMapping("/user/{userId}"
  2. public Rest<?> urlEncode(@PathVariable("userId") String userId) { 
  3.     return RestBody.okData(userId); 

DELETE 請(qǐng)求也推薦使用路徑參數(shù)

3. POST/PUT 請(qǐng)求

GET 請(qǐng)求是從服務(wù)端獲取數(shù)據(jù)的,而 POST 請(qǐng)求則是向服務(wù)端發(fā)送數(shù)據(jù)。很多不清楚它們之間區(qū)別的同學(xué)會(huì)混用它們。我見(jiàn)過(guò)使用 GET 請(qǐng)求修改數(shù)據(jù)的,也見(jiàn)過(guò)使用 POST 請(qǐng)求來(lái)查詢結(jié)果的。雖然它們可以完成期望的工作但是它們之間還是有很大的差別的,這里不得不重復(fù)一下:

  • GET 請(qǐng)求可以直接在瀏覽器直接請(qǐng)求當(dāng)然也會(huì)保留在瀏覽器歷史記錄里,而 POST 不可以。
  • GET 請(qǐng)求是天然冪等性的,而 POST 不是。
  • GET 請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存,而 POST 不會(huì),除非手動(dòng)設(shè)置。
  • GET 請(qǐng)求只能進(jìn)行 URI 編碼,而 POST 支持多種編碼方式。
  • 對(duì)參數(shù)的數(shù)據(jù)類型,GET 只接受 ASCII 字符,而 POST 沒(méi)有限制。
  • GET 比 POST 更不安全,因?yàn)閰?shù)直接暴露在 URL 上,所以不能用來(lái)傳遞敏感信息。
  • GET 參數(shù)通過(guò) URL 傳遞,而且是有長(zhǎng)度限制的,POST 放在請(qǐng)求體中,沒(méi)有長(zhǎng)度限制。

GET 請(qǐng)求會(huì)把請(qǐng)求頭和 DATA 一并發(fā)送出去,然后服務(wù)器響應(yīng);而對(duì)于 POST 請(qǐng)求會(huì)先發(fā)送請(qǐng)求頭告訴服務(wù)器請(qǐng)求的編碼方式等等,然后服務(wù)器響應(yīng) 100 continue 后客戶端再把編碼后的 DATA 發(fā)送給服務(wù)器,由服務(wù)器作出響應(yīng)。另外如果不使用 HTTPS,POST 請(qǐng)求也無(wú)法保證數(shù)據(jù)的安全傳輸。

表單提交

POST 請(qǐng)求最長(zhǎng)使用的場(chǎng)景是表單提交,比如登錄:

  1. <form action="/login" method="POST"
  2.     First name: <input type="text" name="username"><br> 
  3.     Last name: <input type="password" name="password"><br> 
  4.   <input type="submit" value="登錄"
  5. </form> 

這種方式是 POST 的默認(rèn)方式,Content-Type為application/x-www-form-urlencoded。樣例如下:

  1. POST /login HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: application/x-www-form-urlencoded 
  4.  
  5. username=felord.cn&password=felord.cn 

參數(shù)的組織方式參考 GET 請(qǐng)求,但是不是放在 URL 中而是放在請(qǐng)求體中,另外必須顯式聲明Content-Type為application/x-www-form-urlencoded。Spring MVC 中我們可以直接使用對(duì)象來(lái)接收:

  1. @PostMapping("/login"
  2. public Rest<?> doLogin(LoginDTO params) { 
  3.     // params.username = felord.cn 
  4.     // params.password = felord.cn 
  5.     return RestBody.okData(params); 

上面的登錄也可以使用multipart/form-data方式來(lái)請(qǐng)求:

  1. POST /login HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 
  4.  
  5. ----WebKitFormBoundary7MA4YWxkTrZu0gW 
  6. Content-Disposition: form-data; name="username" 
  7.  
  8. felord.cn 
  9. ----WebKitFormBoundary7MA4YWxkTrZu0gW 
  10. Content-Disposition: form-data; name="password" 
  11.  
  12. felord.cn 
  13. ----WebKitFormBoundary7MA4YWxkTrZu0gW 

multipart/form-data將表單中的每個(gè)input轉(zhuǎn)為了一個(gè)由boundary分割的小格式,沒(méi)有轉(zhuǎn)碼,直接將 UTF-8 字節(jié)拼接到請(qǐng)求體中,在本地有多少字節(jié)實(shí)際就發(fā)送多少字節(jié),極大提高了效率,適合傳輸長(zhǎng)字節(jié),通常我們用來(lái)上傳文件等大字節(jié)。例如我們將路徑C:/Users/felord/Desktop/spring-security.pdf文件以myFile為標(biāo)識(shí)名上傳到服務(wù)器:

  1. POST /foo/upload HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 
  4.  
  5. ----WebKitFormBoundary7MA4YWxkTrZu0gW 
  6. Content-Disposition: form-data; name="myFile"; filename="/C:/Users/felord/Desktop/spring-security.pdf" 
  7. Content-Type: application/pdf 
  8.  
  9. (data) 
  10. ----WebKitFormBoundary7MA4YWxkTrZu0gW 

對(duì)應(yīng)的 Spring MVC 接口為:

  1. @PostMapping("/upload"
  2.  public Rest<?> urlEncode(@RequestPart("myFile") MultipartFile file) { 
  3.      String originalFilename = file.getOriginalFilename(); 
  4.      return RestBody.okData(originalFilename); 
  5.  } 

請(qǐng)注意 Spring MVC 文件大小默認(rèn)是10485760bytes。

Ajax POST 請(qǐng)求

目前大部分都是前后端分離了,所以除了上傳之外的 POST 請(qǐng)求更多建議將數(shù)據(jù)使用JSON的形式提交給服務(wù)器。當(dāng)我們需要新增一個(gè)name為felord、age為18的User時(shí)建議這么做:

  1. POST /user/add HTTP/1.1 
  2. Host: localhost:8080 
  3. Content-Type: application/json 
  4.  
  5.     "name""felord"
  6.     "age": 18 

將參數(shù)封裝為JSON并放入請(qǐng)求體提交給后端。

  1. @PostMapping("/user/add"
  2. public Rest<?> add(@RequestBody User user) { 
  3.     return RestBody.okData(user); 

4. 總結(jié)

本文的目的希望在于明確 GET 和 POST 的使用場(chǎng)景和傳參方式,來(lái)幫助你正確使用它們,避免混亂的方式帶來(lái)的參數(shù)傳遞和解析問(wèn)題。好了今天就到這里,多多關(guān)注:碼農(nóng)小胖哥,獲取更多編程干貨。

 本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼農(nóng)小胖哥公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼農(nóng)小胖哥
相關(guān)推薦

2023-08-07 09:25:06

GETPOSTHTTP請(qǐng)求

2015-08-06 13:33:22

PHPGETPOST

2015-10-27 11:06:51

PHPGETPOST

2009-07-02 15:36:18

JSP參數(shù)傳遞get post方法

2023-07-28 14:32:33

QtPOST請(qǐng)求

2020-09-24 10:09:01

GETPOST前端

2014-08-13 10:20:59

HttpURLConn

2014-08-15 13:11:03

HttpURLConn

2021-02-09 21:49:51

Python參數(shù)Get

2019-08-08 16:00:08

HTTPGETPOST

2010-09-17 10:50:35

sip請(qǐng)求

2011-07-28 18:25:27

Cocoa 異步請(qǐng)求 libxml2

2021-12-13 07:50:14

cURL響應(yīng)時(shí)間

2025-02-06 08:09:20

POSTGET數(shù)據(jù)

2024-07-15 00:00:00

POST瀏覽器網(wǎng)絡(luò)

2011-06-08 11:02:14

GetPost

2022-07-12 17:03:43

鴻蒙網(wǎng)絡(luò)請(qǐng)求庫(kù)

2021-04-26 10:47:54

AJAXDjango前端

2022-12-19 07:28:53

Kubernetes資源請(qǐng)求限制

2021-11-30 08:57:43

GETPOSTJava
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久久成人网 | 国产在线精品一区二区 | 久久色视频 | 国产美女精品视频 | 日韩精品视频网 | 色视频在线播放 | 亚洲一区二区三区在线播放 | www.日韩免费 | 日韩久久久久 | 天堂一区| 久久成人18免费网站 | 久久久久国产一区二区三区 | 2019精品手机国产品在线 | 精品久久一区二区三区 | 9999视频| 午夜精品一区二区三区免费视频 | 久久久日韩精品一区二区三区 | 免费成人高清在线视频 | 日韩国产欧美一区 | 狠狠色综合欧美激情 | 日本三级全黄三级a | 毛片在线看片 | 国产精品久久久久久吹潮 | 午夜成人在线视频 | 日韩在线 | 久久国产精彩视频 | 天堂中文在线观看 | 国产乱码精品一区二区三区五月婷 | 亚洲一在线 | 亚洲精品一区中文字幕乱码 | 91xxx在线观看 | 337p日本欧洲亚洲大胆 | 国产丝袜一区二区三区免费视频 | 人人做人人澡人人爽欧美 | 日韩欧美在线观看 | 91看国产 | 女人牲交视频一级毛片 | 国产视频久久 | 免费黄色的网站 | 国产三级精品视频 | 亚洲视频免费一区 |