- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) >
- POST請求和GET請求怎么傳遞和接收解析參數
本篇內容介紹了“POST請求和GET請求怎么傳遞和接收解析參數”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
1. 前言
接口參數應該怎么傳遞是每個(gè)項目應該面對的問(wèn)題,這跟編程語(yǔ)言無(wú)關(guān),今天來(lái)總結一波常用的接口參數傳遞方式。
2. GET 請求
GET 請求一般用來(lái)向請求獲取數據??傮w來(lái)說(shuō)目前有兩種傳參風(fēng)格類(lèi)型。
多參數拼接
這是我們最常見(jiàn)的傳遞方式,它一般傳參方式如下:
GET /api/v1/user?name=felord.cn&age=18 HTTP/1.1 Host: localhost:8080
規則為:參數和 URI 之間用問(wèn)號?隔開(kāi), 參數鍵值用等號=連接,然后參數之間用連接符&拼接起來(lái),如樣例中的name=felord.cn&age=18。在 Spring MVC 中這種參數可以被對象接收:
@GetMapping("/user") public Rest<?> urlEncode(User params) { // params.name = felord.cn // params.age = 18 return RestBody.okData(params); }
通過(guò)HttpServletRequest#getParameter(String key)也獲取上述方式攜帶的參數,但是一般這種方式建議在 Servlet Filter 過(guò)濾器使用,而不建議在接口中使用。Spring MVC 攔截器獲取參數的底層也是該方式實(shí)現的。但是我也發(fā)現很多人在接口中使用此不合理的方式。
另外 URL 的長(cháng)度是有限制的,如果 GET 請求包含了過(guò)于復雜的參數組合,說(shuō)明業(yè)務(wù)設計是有問(wèn)題的。
路徑標識參數
還有一種方式就是路徑參數,這種參數是期望獲取數據的標識,一般為數據的唯一標識或者分頁(yè)參數。例如查詢(xún)標識為1的用戶(hù):
GET /api/v1/user/1 HTTP/1.1 Host: localhost:8080
查詢(xún)第1頁(yè)(每頁(yè)10條)的用戶(hù):
GET /api/v1/users/1/10 HTTP/1.1 Host: localhost:8080
在 Spring MVC 中這種參數需要通過(guò)@PathVariable來(lái)處理:
@GetMapping("/user/{userId}") public Rest<?> urlEncode(@PathVariable("userId") String userId) { return RestBody.okData(userId); }
DELETE 請求也推薦使用路徑參數
3. POST/PUT 請求
GET 請求是從服務(wù)端獲取數據的,而 POST 請求則是向服務(wù)端發(fā)送數據。很多不清楚它們之間區別的同學(xué)會(huì )混用它們。我見(jiàn)過(guò)使用 GET 請求修改數據的,也見(jiàn)過(guò)使用 POST 請求來(lái)查詢(xún)結果的。雖然它們可以完成期望的工作但是它們之間還是有很大的差別的,這里不得不重復一下:
GET 請求可以直接在瀏覽器直接請求當然也會(huì )保留在瀏覽器歷史記錄里,而 POST 不可以。
GET 請求是天然冪等性的,而 POST 不是。
GET 請求會(huì )被瀏覽器主動(dòng)緩存,而 POST 不會(huì ),除非手動(dòng)設置。
GET 請求只能進(jìn)行 URI 編碼,而 POST 支持多種編碼方式。
對參數的數據類(lèi)型,GET 只接受 ASCII 字符,而 POST 沒(méi)有限制。
GET 比 POST 更不安全,因為參數直接暴露在 URL 上,所以不能用來(lái)傳遞敏感信息。
GET 參數通過(guò) URL 傳遞,而且是有長(cháng)度限制的,POST 放在請求體中,沒(méi)有長(cháng)度限制。
GET 請求會(huì )把請求頭和 DATA 一并發(fā)送出去,然后服務(wù)器響應;而對于 POST 請求會(huì )先發(fā)送請求頭告訴服務(wù)器請求的編碼方式等等,然后服務(wù)器響應 100 continue 后客戶(hù)端再把編碼后的 DATA 發(fā)送給服務(wù)器,由服務(wù)器作出響應。另外如果不使用 HTTPS,POST 請求也無(wú)法保證數據的安全傳輸。
表單提交
POST 請求最長(cháng)使用的場(chǎng)景是表單提交,比如登錄:
<form action="/login" method="POST"> First name: <input type="text" name="username"><br> Last name: <input type="password" name="password"><br> <input type="submit" value="登錄"> </form>
這種方式是 POST 的默認方式,Content-Type為application/x-www-form-urlencoded。樣例如下:
POST /login HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www-form-urlencoded username=felord.cn&password=felord.cn
參數的組織方式參考 GET 請求,但是不是放在 URL 中而是放在請求體中,另外必須顯式聲明Content-Type為application/x-www-form-urlencoded。Spring MVC 中我們可以直接使用對象來(lái)接收:
@PostMapping("/login") public Rest<?> doLogin(LoginDTO params) { // params.username = felord.cn // params.password = felord.cn return RestBody.okData(params); }
上面的登錄也可以使用multipart/form-data方式來(lái)請求:
POST /login HTTP/1.1 Host: localhost:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="username" felord.cn ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="password" felord.cn ----WebKitFormBoundary7MA4YWxkTrZu0gW
multipart/form-data將表單中的每個(gè)input轉為了一個(gè)由boundary分割的小格式,沒(méi)有轉碼,直接將 UTF-8 字節拼接到請求體中,在本地有多少字節實(shí)際就發(fā)送多少字節,極大提高了效率,適合傳輸長(cháng)字節,通常我們用來(lái)上傳文件等大字節。例如我們將路徑C:/Users/felord/Desktop/spring-security.pdf文件以myFile為標識名上傳到服務(wù)器:
POST /foo/upload HTTP/1.1 Host: localhost:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="myFile"; filename="/C:/Users/felord/Desktop/spring-security.pdf" Content-Type: application/pdf (data) ----WebKitFormBoundary7MA4YWxkTrZu0gW
對應的 Spring MVC 接口為:
@PostMapping("/upload") public Rest<?> urlEncode(@RequestPart("myFile") MultipartFile file) { String originalFilename = file.getOriginalFilename(); return RestBody.okData(originalFilename); }
請注意 Spring MVC 文件大小默認是10485760bytes。
Ajax POST 請求
目前大部分都是前后端分離了,所以除了上傳之外的 POST 請求更多建議將數據使用JSON的形式提交給服務(wù)器。當我們需要新增一個(gè)name為felord、age為18的User時(shí)建議這么做:
POST /user/add HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "name": "felord", "age": 18 }
將參數封裝為JSON并放入請求體提交給后端。
@PostMapping("/user/add") public Rest<?> add(@RequestBody User user) { return RestBody.okData(user); }
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2 建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站