重慶南川網(wǎng)站制作公司哪家專業(yè)sem搜索引擎營(yíng)銷
首先,前端請(qǐng)求后端數(shù)據(jù),后端響應(yīng)數(shù)據(jù)給前端,這是我們大家都知道的,那其中所涉及到的數(shù)據(jù)傳輸協(xié)議又是什么呢?這個(gè)傳輸規(guī)范就是我們大名鼎鼎的HTTP協(xié)議!
什么是HTTP協(xié)議?
HTTP(超文本傳輸協(xié)議)是一種用于在計(jì)算機(jī)網(wǎng)絡(luò)上發(fā)送和接收超文本資源的應(yīng)用層協(xié)議。它是在Web應(yīng)用程序之間傳輸數(shù)據(jù)的一種規(guī)范。HTTP的設(shè)計(jì)目的是實(shí)現(xiàn)客戶端和服務(wù)器之間的通信和數(shù)據(jù)交換。
HTTP協(xié)議使用簡(jiǎn)單的請(qǐng)求-響應(yīng)模型來(lái)傳輸數(shù)據(jù)??蛻舳税l(fā)送HTTP請(qǐng)求到服務(wù)器,服務(wù)器根據(jù)請(qǐng)求作出相應(yīng)并返回HTTP響應(yīng)。請(qǐng)求和響應(yīng)的內(nèi)容可以是文本、HTML、XML、JSON等格式的數(shù)據(jù)。
HTTP協(xié)議的特點(diǎn)包括:
1. 無(wú)連接:每個(gè)請(qǐng)求-響應(yīng)交互都是獨(dú)立的,服務(wù)器不會(huì)保持與客戶端之間的持久連接。每個(gè)請(qǐng)求都需要建立一個(gè)新的連接。這使得HTTP協(xié)議具有輕量級(jí)和靈活性,但也會(huì)增加一些額外的開(kāi)銷。
2. 無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)的,服務(wù)器不會(huì)記錄之前的通信狀態(tài)。每個(gè)請(qǐng)求都是相互獨(dú)立的,服務(wù)器無(wú)法感知到之前的請(qǐng)求。這要求服務(wù)端在處理請(qǐng)求時(shí),對(duì)前后請(qǐng)求之間的上下文和狀態(tài)進(jìn)行管理。
3. 可擴(kuò)展:HTTP協(xié)議支持開(kāi)發(fā)者擴(kuò)展協(xié)議功能。通過(guò)使用頭部字段來(lái)傳遞各種參數(shù)和元數(shù)據(jù),開(kāi)發(fā)者可以自定義和擴(kuò)展協(xié)議的行為。
先來(lái)一個(gè)簡(jiǎn)單的示例,創(chuàng)建springboot工程之后,加入以下代碼片段:
@RestController
public class SpringbootFirstTest {//設(shè)置請(qǐng)求的地址@RequestMapping("/helloTest")public String getAddress(){System.out.println("hello world!");return "hello world!";}
}
說(shuō)明:
@RestController= @Controller + @ResponseBody
@ResponseBody注解是作用于類的返回對(duì)象
????????● 類型:屬于方法注解、類注解
????????● 位置:書寫在Controller方法上或類上
????????● 作用:將方法返回值直接響應(yīng)給瀏覽器,且如果返回值類型是實(shí)體對(duì)象/集合,將會(huì)轉(zhuǎn)換為JSON格式后在響應(yīng)給瀏覽器?,所以這里特別注意如果返回值不是實(shí)體類對(duì)象/集合的話,是不會(huì)轉(zhuǎn)換成json格式的!
Springboot的服務(wù)啟動(dòng)之后,我們來(lái)到瀏覽器找到本地8080端口下,對(duì)請(qǐng)求路徑發(fā)起請(qǐng)求得到如下的圖?
@RestController
public class SpringbootFirstTest {//設(shè)置請(qǐng)求的地址@RequestMapping("/helloTest")public Set<Object> getAddress(){System.out.println("hello world!");Set<Object> set = new HashSet<>();set.add(1);set.add(2);set.add(3);return set;}
}
這里我的瀏覽器安裝了對(duì)應(yīng)的json格式解析插件?
HTTP協(xié)議又分為:請(qǐng)求協(xié)議和響應(yīng)協(xié)議
● 請(qǐng)求協(xié)議:瀏覽器將數(shù)據(jù)以請(qǐng)求格式發(fā)送到服務(wù)器
????????● 包括:**請(qǐng)求行**、**請(qǐng)求頭** 、**請(qǐng)求體**
● 響應(yīng)協(xié)議:服務(wù)器將數(shù)據(jù)以響應(yīng)格式返回給瀏覽器
????????● 包括:**響應(yīng)行** 、**響應(yīng)頭** 、**響應(yīng)體**?
打開(kāi)開(kāi)發(fā)者工具(右鍵檢查或則F12快捷鍵),每點(diǎn)擊一次刷新,瀏覽器都會(huì)重新發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求,框起來(lái)的部分即就是我們HTTP的固定格式,可以看出http無(wú)論是請(qǐng)求還是響應(yīng)都是以Key、Value的形式進(jìn)行展示
先看常規(guī):
這里邊需要關(guān)注的是請(qǐng)求的網(wǎng)址、方法、狀態(tài)代碼,請(qǐng)求的網(wǎng)址在前后端開(kāi)發(fā)的時(shí)候必須遵守,要不然找不到對(duì)應(yīng)的資源;方法即代表當(dāng)前所請(qǐng)求的類型,待會(huì)兒會(huì)著重梳理一下,這里有一個(gè)非常重要的知識(shí)——狀態(tài)碼,狀態(tài)碼是鑒別本次請(qǐng)求響應(yīng),返回結(jié)果的一種體現(xiàn):
狀態(tài)碼 | 說(shuō)明 |
---|---|
1xx | 信息性狀態(tài)碼,表示請(qǐng)求被接收并繼續(xù)處理。 |
2xx | 成功狀態(tài)碼,表示請(qǐng)求被成功接收、理解和處理。 |
3xx | 重定向狀態(tài)碼,表示資源位置發(fā)生變化,需要進(jìn)一步處理。 |
4xx | 客戶端錯(cuò)誤狀態(tài)碼,表示請(qǐng)求包含錯(cuò)誤或無(wú)法完成請(qǐng)求。 |
5xx | 服務(wù)器錯(cuò)誤狀態(tài)碼,表示服務(wù)器無(wú)法完成合法請(qǐng)求。 |
瀏覽器向服務(wù)器發(fā)起請(qǐng)求:
可以看到,在請(qǐng)求行中,有一個(gè)GET,而他代表的就是瀏覽器所發(fā)起請(qǐng)求的方式,那么請(qǐng)求方式有哪些呢?
請(qǐng)求方式???????? | 請(qǐng)求說(shuō)明 |
---|---|
GET???????? | 獲取資源:向特定的資源發(fā)起請(qǐng)求 |
POST | 傳輸實(shí)體主體:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求,常見(jiàn)的就是上傳的操作,數(shù)據(jù)被包含在請(qǐng)求體中 |
PUT | PUT方法用來(lái)傳輸文件。類似FTP協(xié)議,文件內(nèi)容包含在請(qǐng)求報(bào)文的實(shí)體中,然后請(qǐng)求保存到URL指定的服務(wù)器位置。 |
DELETE | 刪除文件:請(qǐng)求服務(wù)器刪除Request-URL所標(biāo)識(shí)的資源 |
CONNECT | 用求用隧道協(xié)議連接代理,HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器 |
OPTIONS | 返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方式。因?yàn)椴⒉皇撬械姆?wù)器都支持規(guī)定的方法,為了安全有些服務(wù)器可能會(huì)禁止掉一些方法,例如:DELETE、PUT等。那么OPTIONS就是用來(lái)詢問(wèn)服務(wù)器支持的方法。 |
HEAD | HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回?cái)?shù)據(jù)。通常用于確認(rèn)URI的有效性及資源更新時(shí)間等。 |
請(qǐng)求的常用配置詳解:
請(qǐng)求行:
????????HTTP請(qǐng)求中的第一行數(shù)據(jù)。由: 請(qǐng)求方式 、 資源路徑 、 協(xié)議/版本 組成(之間使用空格分隔)
● 請(qǐng)求方式:GET
● 資源路徑:/brand/findAll?name=OPPO&status=1
● 請(qǐng)求路徑:/brand/findAll
● 請(qǐng)求參數(shù):name=OPPO&status=1
● 請(qǐng)求參數(shù)是以key=value形式出現(xiàn)
● 多個(gè)請(qǐng)求參數(shù)之間使用 & 連接
● 請(qǐng)求路徑和請(qǐng)求參數(shù)之間使用 ? 連接
● 協(xié)議/版本:HTTP/1.1請(qǐng)求頭:
1. Accept:指定客戶端可接受的媒體類型,可以用來(lái)告訴服務(wù)器返回特定類型的內(nèi)容。例如:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp
2. Content-Type:指定請(qǐng)求體(Request Body)的媒體類型。常見(jiàn)的有 application/json、application/x-www-form-urlencoded、multipart/form-data等。
例如:Content-Type: application/json,這里在Springboot工程中,如果不確定是否使用@Requstbody注解,通常項(xiàng)目開(kāi)發(fā)中會(huì)約定數(shù)據(jù)的傳輸格式,如果不確定是否使用json時(shí),可以根據(jù)網(wǎng)絡(luò)請(qǐng)求體的媒體類型來(lái)決定要不要將json數(shù)據(jù)封裝成為對(duì)象。如果盲目使用@Requstbody可能會(huì)造成以下的異常:
HttpMessageNotReadableException: Required request body is missing
3. User-Agent:標(biāo)識(shí)發(fā)起請(qǐng)求的客戶端應(yīng)用程序的軟件和版本信息。通常用于統(tǒng)計(jì)和識(shí)別用戶代理。例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
4. Authorization:用于在請(qǐng)求中發(fā)送認(rèn)證憑據(jù),通常用于身份驗(yàn)證。例如:Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
5. Cookie:用于在請(qǐng)求中發(fā)送存儲(chǔ)在客戶端的 Cookie 數(shù)據(jù)。例如:Cookie: sessionId=abc123; userId=12345
6. Referer:指定請(qǐng)求的來(lái)源頁(yè)面的 URL,用于一些安全策略和數(shù)據(jù)分析。例如:Referer: https://www.example.com/page1.html
7. Cache-Control:指定緩存機(jī)制和緩存策略。例如:Cache-Control: no-cache
8. If-None-Match:用于實(shí)現(xiàn)緩存驗(yàn)證機(jī)制,服務(wù)器會(huì)根據(jù)請(qǐng)求頭中的 ETag 值判斷資源是否需要重新發(fā)送。例如:If-None-Match: "686897696a7c876b7e"
9.?Accept-Encoding: 支持的壓縮類型,如:gzip, deflate, br?
10.sec-fetch/ch- ?代表
sec-ch-ua:瀏覽器信息
sec-ch-ua-mobile:是否為移動(dòng)設(shè)備
sec-ch-ua-platform:平臺(tái)
sec-fetch-dest:表示請(qǐng)求的目的,期望需要什么樣的資源
sec-fetch-mode:表明了一個(gè)請(qǐng)求的模式
????????request:一個(gè)瀏覽器的頁(yè)面切換請(qǐng)求
????????navigate:僅在瀏覽器切換頁(yè)面時(shí)創(chuàng)建,該請(qǐng)求應(yīng)該返回HTML
sec-getch-site:一個(gè)請(qǐng)求發(fā)起者的來(lái)源與目標(biāo)資源之間的關(guān)系,如果用戶直接觸發(fā)頁(yè)面導(dǎo)航,例如在瀏覽器地址中輸入地址,點(diǎn)擊書簽跳轉(zhuǎn)等,就會(huì)設(shè)置為none
sec-getc-user:取值是一個(gè)Boolean類型的值
? ? ? ? true(?1):表示導(dǎo)航請(qǐng)求由用戶激活觸發(fā)(鼠標(biāo)點(diǎn)擊/鍵盤)
? ? ? ? false(?0):表示導(dǎo)航請(qǐng)求由用戶激活以外的原因觸發(fā)
upgrade-Insecure-requests:升級(jí)不安全的連接
? ? ? ? 在https頁(yè)面中,如果調(diào)用了http資源,那么瀏覽器就會(huì)拋出以下錯(cuò)誤,為了改變這一狀況,chrome(谷歌瀏覽器)會(huì)在http請(qǐng)求中加入‘Upgrade-Insecure-requests:1’,服務(wù)器收到請(qǐng)求后會(huì)返回 "Content-Security-Policy: upgrade-insecure-requests" 頭,告訴瀏覽器,可以把所屬本站的所有http 連接升級(jí)為 https 連接
服務(wù)器向?yàn)g覽器響應(yīng)數(shù)據(jù):
?響應(yīng)常用配置詳解:
響應(yīng)行:
請(qǐng)求行(以上圖中紅色部分):包含請(qǐng)求方式、資源路徑、協(xié)議/版本
● 請(qǐng)求方式:POST
● 資源路徑:/brand
● 協(xié)議/版本:HTTP/1.1?響應(yīng)頭:
1. Content-Type:指定響應(yīng)體(Response Body)的媒體類型。常見(jiàn)的有 text/html、application/json、image/jpeg 等。例如:Content-Type: application/json
2. Content-Length:指定響應(yīng)體的內(nèi)容長(zhǎng)度,以字節(jié)為單位。例如:Content-Length: 1024
3. Cache-Control:指定緩存機(jī)制和緩存策略??梢钥刂瓶蛻舳撕椭虚g緩存服務(wù)器對(duì)響應(yīng)內(nèi)容進(jìn)行緩存的方式。例如:Cache-Control: max-age=3600, public
4. Expires:指定響應(yīng)的過(guò)期時(shí)間,告訴客戶端該資源的有效期截止時(shí)間。例如:Expires: Wed, 01 Feb 2024 12:00:00 GMT
5. Last-Modified:指定響應(yīng)資源的最后修改時(shí)間,用于實(shí)現(xiàn)緩存驗(yàn)證機(jī)制。例如:Last-Modified: Fri, 24 Jan 2024 10:00:00 GMT
6. ETag:指定響應(yīng)資源的唯一標(biāo)識(shí)符,也用于實(shí)現(xiàn)緩存驗(yàn)證機(jī)制。例如:ETag: "686897696a7c876b7e"
7. Set-Cookie:用于在響應(yīng)中設(shè)置客戶端的 Cookie 數(shù)據(jù)。例如:Set-Cookie: sessionId=abc123; Max-Age=3600; Path=/
8. Access-Control-Allow-Origin:用于允許跨域訪問(wèn)的源,設(shè)置為 * 表示允許所有域名跨域。例如:Access-Control-Allow-Origin: *
兩者有什么區(qū)別?
區(qū)別方式 | ?GET請(qǐng)求 | POST請(qǐng)求 |
請(qǐng)求參數(shù) | GET的請(qǐng)求參數(shù)在請(qǐng)求行中就有所體現(xiàn),在上邊請(qǐng)求配置詳解中有提到,例:/brand/findAll? name=OPPO&status=1 | 請(qǐng)求參數(shù)在請(qǐng)求體中 |
請(qǐng)求長(zhǎng)度 | 請(qǐng)求參數(shù)長(zhǎng)度有限制(瀏覽器不同限制也不同) | 請(qǐng)求參數(shù)長(zhǎng)度沒(méi)有限制 |
安全性 | 安全性低。原因:請(qǐng)求參數(shù)暴露在瀏覽器地址欄中。 | 安全性相對(duì)高 |