中國做網(wǎng)站的網(wǎng)站百度搜索風(fēng)云榜單
1、HTTP請(qǐng)求傳遞參數(shù)分類
1.1、按照請(qǐng)求方式分類
GET方法
:通過查詢字符串(Query String,每個(gè)參數(shù)由參數(shù)名和參數(shù)值組成,使用等號(hào)=
連接,不同參數(shù)之間使用&
符號(hào)分隔)的方式或直接將參數(shù)放在URL中來傳遞參數(shù)POST方法
:通過請(qǐng)求體(body)以表單形式或JSON數(shù)據(jù)格式等編碼方式傳遞參數(shù)PUT方法
:與POST方法類似,通過請(qǐng)求體以JSON等格式傳遞參數(shù),但PUT方法通常用于更新操作DELETE方法
:與POST方法類似,通過請(qǐng)求體以JSON等格式傳遞參數(shù),但DELETE方法通常用于刪除操作
在早期版本的HTTP中,只定義了GET和POST兩種請(qǐng)求方法,用于獲取和提交資源,然而,為了更好地支持RESTful架構(gòu)和其他類型的操作,HTTP/1.1版本增加了PUT和DELETE這兩種請(qǐng)求方法,使得開發(fā)者能夠更靈活地設(shè)計(jì)和實(shí)現(xiàn)與資源相關(guān)的操作,盡管HTTP/1.1引入了PUT和DELETE請(qǐng)求方法,但其具體使用仍受到服務(wù)器和應(yīng)用程序的支持與限制。不同的服務(wù)器和框架可能對(duì)PUT和DELETE請(qǐng)求方法有不同的處理方式和約束條件。
1.2、按照數(shù)據(jù)格式(Content-Type)分類
**Content-Type說明:**當(dāng)參數(shù)放在 URL 中作為查詢參數(shù)時(shí),并沒有 Content-Type。在這種情況下,請(qǐng)求頭中并不包含 Content-Type 字段,當(dāng)使用 GET 請(qǐng)求時(shí),常見的方式是將參數(shù)直接附加在 URL 的查詢字符串中,例如:https://example.com/api?param1=value1¶m2=value2
。這種方式不需要設(shè)置 Content-Type,因?yàn)閰?shù)是直接拼接在 URL 中的,而非放在請(qǐng)求體中。
Content-Type主要用于 POST、PUT 等通過請(qǐng)求體傳遞參數(shù)的請(qǐng)求方法,表示請(qǐng)求體中的數(shù)據(jù)類型。對(duì)于這些請(qǐng)求,參數(shù)通常會(huì)放在請(qǐng)求體中進(jìn)行傳輸。在這種情況下,需要設(shè)置合適的 Content-Type
來指定請(qǐng)求體中數(shù)據(jù)的格式,如 application/x-www-form-urlencoded
、multipart/form-data
或 application/json
等。
Content-Type分類:
①application/x-www-form-urlencoded
一般用于 POST 請(qǐng)求數(shù)據(jù)的格式,它通常用于向服務(wù)器提交表單數(shù)據(jù)。在 application/x-www-form-urlencoded
格式中,請(qǐng)求參數(shù)被編碼為鍵值對(duì),每個(gè)鍵值對(duì)之間使用 “&” 符號(hào)進(jìn)行分隔,鍵與值之間使用 “=” 符號(hào)進(jìn)行分隔。鍵和值中的特殊字符會(huì)被轉(zhuǎn)義成它們的 ASCII 碼值的十六進(jìn)制表示,即使用百分號(hào) “%” 后跟兩位十六進(jìn)制數(shù)表示。其和 query 差不多,都是利用 &
來拼接數(shù)據(jù),也都要進(jìn)行URL編碼,只不過 form-urlencoded
把這個(gè)字符串放在 body 里了
application/x-www-form-urlencoded
請(qǐng)求示例:
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencodedusername=john&password=123456
后端控制層代碼:
@PostMapping("/api/login")
public ResponseEntity<String> login(@RequestParam("username") String username,@RequestParam("password") String password) {//……
}
②multipart/form-data
通常用于提交包含文件上傳等二進(jìn)制數(shù)據(jù)的表單,--------- + 隨機(jī)數(shù)
做為分隔符。相比較于application/x-www-form-urlencoded
編碼方式,multipart/form-data
能夠支持更大的數(shù)據(jù)量和更多類型的數(shù)據(jù)。在使用multipart/form-data
時(shí),表單數(shù)據(jù)被分割成多個(gè)部分進(jìn)行傳輸,每個(gè)部分都有自己的Content-Type,并且可以攜帶自己的額外信息(比如文件名、字符集等),因此也被稱為多部分表單編碼方式。multipart/form-data
通常用于上傳文件,因?yàn)樗С侄M(jìn)制數(shù)據(jù)的傳輸。當(dāng)使用普通的application/x-www-form-urlencoded
編碼方式時(shí),無法直接傳輸二進(jìn)制數(shù)據(jù),而multipart/form-data
編碼方式可以將文件以及其他表單字段一起作為請(qǐng)求體進(jìn)行傳輸。
通過multipart/form-data
編碼方式,可以將文件的內(nèi)容直接作為請(qǐng)求的一部分發(fā)送到服務(wù)器。在服務(wù)器端,可以通過解析multipart/form-data
請(qǐng)求來處理文件上傳操作,并將上傳的文件保存到服務(wù)器的文件系統(tǒng)或進(jìn)行其他的業(yè)務(wù)邏輯處理。
multipart/form-data
請(qǐng)求的示例:
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg(二進(jìn)制文件內(nèi)容)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="title"Example title
----WebKitFormBoundary7MA4YWxkTrZu0gW--
后端控制層代碼:
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file,@RequestParam("title") String title) {//……
}
③text/plain
(raw
,即原始數(shù)據(jù))
一種簡單的文本格式,沒有特殊的格式要求和編碼規(guī)則。通常,使用 text/plain 格式傳輸?shù)臄?shù)據(jù)只包含 ASCII 字符集中的字符,對(duì)于 Unicode 字符集中的字符可能會(huì)出現(xiàn)亂碼情況。因此,在需要傳輸非 ASCII 字符集中的字符時(shí),通常會(huì)選擇使用其他格式,如 UTF-8 編碼的文本格式(text/plain;charset=UTF-8)
text/plain 格式通常用于傳輸純文本數(shù)據(jù),例如 HTML、CSS 和 JavaScript 代碼、日志記錄等。在 HTTP 請(qǐng)求中,當(dāng) Content-Type 字段的值為 text/plain 時(shí),服務(wù)器會(huì)將請(qǐng)求體中的數(shù)據(jù)作為純文本進(jìn)行處理。在 HTTP 響應(yīng)中,當(dāng) Content-Type 字段的值為 text/plain 時(shí),客戶端會(huì)將響應(yīng)體中的數(shù)據(jù)作為純文本進(jìn)行處理
④application/xml
將XML格式的數(shù)據(jù)放置于請(qǐng)求體中傳遞,或者將服務(wù)器返回的XML格式數(shù)據(jù)作為響應(yīng)體發(fā)送給客戶端。
application/xml
請(qǐng)求和響應(yīng)的示例:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/xml<user><name>John Doe</name><email>john.doe@example.com</email><age>30</age>
</user>
后端控制層:
@PostMapping("/api/users")
public ResponseEntity<User> createUser(@RequestBody User user) {//……
}
⑤application/json
將參數(shù)以JSON格式編碼并放置于請(qǐng)求體中傳遞,通常用于在HTTP請(qǐng)求和響應(yīng)中傳輸JSON(JavaScript Object Notation)數(shù)據(jù)。JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,易于讀寫和解析,并且被廣泛用于Web應(yīng)用程序和API中。
application/json
請(qǐng)求示例:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json{"name": "John Doe","email": "john.doe@example.com","age": 30
}
后端控制層:
@PostMapping("/api/users")
public ResponseEntity<User> createUser(@RequestBody User user) {//……
}
1.3、按照參數(shù)作用范圍分類
①查詢參數(shù)(Query Param):在GET方法中出現(xiàn),以鍵值對(duì)的形式出現(xiàn)在URL的查詢字符串中,用于過濾、排序等操作。在請(qǐng)求url后面加上?以鍵值對(duì)的方式傳遞參數(shù),利用 &
來分割數(shù)據(jù)
②路徑參數(shù)(Path Param):在Get方法中出現(xiàn),直接在 url 后面加上參數(shù),后端使用占位符。
③請(qǐng)求體(Request Body):在POST、PUT和DELETE等方法中出現(xiàn),用于傳遞請(qǐng)求的具體數(shù)據(jù),通過Content-Type
指明數(shù)據(jù)格式。
2、擴(kuò)展
2.1、URL編碼
URL中傳遞的參數(shù)通常都需要進(jìn)行URL編碼,以確保特殊字符不會(huì)破壞URL的結(jié)構(gòu)。當(dāng)使用帶有占位符的URL時(shí),需要將占位符中的實(shí)際值進(jìn)行URL編碼,并將編碼后的值替換到相應(yīng)的占位符位置。URL編碼也稱為百分號(hào)編碼(Percent-encoding),它使用%XX的形式表示ASCII字符集中的非可打印字符和一些特殊字符。
例如,空格在URL中是不允許出現(xiàn)的,如果需要在URL中傳遞包含空格的字符串,就需要對(duì)空格進(jìn)行編碼??崭竦腁SCII碼是32,它可以被編碼為%20,因此傳遞包含空格的字符串時(shí),應(yīng)該將空格替換為%20。類似地,其他特殊字符也需要進(jìn)行編碼,例如“/”應(yīng)該編碼為“%2F”,“?”應(yīng)該編碼為“%3F”,等等。
瀏覽器和其他HTTP客戶端通常會(huì)自動(dòng)對(duì)URL中的參數(shù)進(jìn)行編碼,因此開發(fā)者不需要手動(dòng)進(jìn)行URL編碼。在服務(wù)端,后臺(tái)框架和程序庫通常也提供了相關(guān)的API,用于解析和處理URL中的參數(shù)。無論是客戶端還是服務(wù)端,在處理URL參數(shù)時(shí),都應(yīng)該遵守相應(yīng)的規(guī)范和標(biāo)準(zhǔn),以確保程序的正確性和安全性。