網絡原理 - 12(HTTP/HTTPS - 3 - 響應)

目錄

認識“狀態碼”(status code)

200 OK

404 Not Found

403 Forbidden

405 Method Not Allowed

500 Internal Server Error

504 Gateway Timeout

302 Move temporarily

301 Moved Permanently

418 I am a teaport

狀態碼小結:

認識響應“報頭”(header)

Content - Type

構造 HTTP 請求

通過第三方工具進行構造

通過代碼來構造 HTTP 請求

完!


認識“狀態碼”(status code)

狀態碼是表示一個頁面的結果。(是訪問成功,還是失敗,話是其他的一些情況...)

HTTP 中的狀態碼都是約定好的:

上面的狀態碼并不需要全部都記住,只需要直到幾個常見的狀態碼即可~~

200 OK

這是一個最常見的狀態碼, 表示訪問成功

404 Not Found

表示沒有找到資源。

瀏覽器輸入一個 URL,目的就是為了訪問對方服務器上的一個資源。如果這個 URL 標識的資源不存在,那么就會出現 404。例如,在瀏覽器中輸入 www.bilibli.com/index.html,此時就在嘗試訪問 嗶哩嗶哩上的 /index.html 這個資源。

如果輸入正確,就可以正確訪問到,但是如果輸入錯誤,比如 www.bilibili.com/index333.html,就會看到 404 這樣的響應。(不過 bilibili 比較有特點,他特意為 404 做了一個比較符合宅男動漫的頁面~~)

403 Forbidden

表示訪問被拒絕。有的頁面通常需要用戶具有一定的權限(比如登陸后才能進行訪問)如果用戶沒有登錄直接訪問,就容易看到 403。

例如:我們在碼云上查看一個其他人的私人倉庫,就會出現 403,參考鏈接:https://gitee.com/HGtz2222/blog_python

405 Method Not Allowed

前面我們學習了 HTTP 中所支持的方法,有 GET,POST,PUT,DELETE 等等。

但是對方的服務器不一定支持所有的方法,比如:服務器只支持 GET 請求,但是我們發送了一個 POST,就會出現 405 Method Not Allowed。

500 Internal Server Error

服務器內部出現錯誤,一般是服務器的代碼執行過程中,遇到了一些特殊的情況(服務器崩潰)會產生這個狀態碼~~

504 Gateway Timeout

當服務器負載比較大的時候,服務器處理單條請求的時間消耗的時間就會很長,就可能出現訪問服務器超時。這種情況可能是服務器掛了,也可能是網絡掛了~~

302 Move temporarily

臨時重定向

理解“重定向”

就相當于手機號碼中的“呼叫轉移”功能。

比如我們本來的手機號是 123-4567-7899,后來換了一個新的號碼是 999-4567-7891,此時難道是一個一個朋友告訴我們的新號碼碼??

我們可以去辦理一個呼叫轉移業務,其他人撥打 123-4567-7899 的時候,就會自動轉移到999-4567-7891 上

我們在登錄頁面經常會見到 302,用戶實現登陸成功后自動跳轉到主頁。

響應報文中的 header 部分會包含一個 Location 字段,表示要跳轉到那個頁面~~

我們以碼云的登錄為例:登陸后的抓包結果:

可以看到 header 中的 Location:https://gitee.com/,接下來瀏覽器就會自動發送 GET?

請求,獲取 https://gitee.com/?

301 Moved Permanently

永久重定向,當瀏覽器收到這種響應時候,后續的請求都會被自動改成新的地址,不必多一次跳轉了。(可以影響到瀏覽器的緩存)

在上面 301 和 302 這種重定向報文的響應中,會有一個特殊的 header 叫做 Location,描述了要重定向的位置是在哪里~~

418 I am a teaport

一個特殊的狀態碼,沒有實際的含義,I am a teaport 我是個茶壺(我是個杯具~~)?

設計 HTTP 協議的大佬開玩笑 == 》 “彩蛋~”

狀態碼小結:

認識響應“報頭”(header)

響應報頭的基本格式和請求報頭的格式基本一致

類似 Content - Type,Content - Length 等屬性的含義也和請求中的含義一致~~

Content - Type

響應中的 Content - Type 常見取值有以下幾種:

text/html :body 數據格式是 HTML

text/css: body 數據格式是 CSS

application/javascript: body 數據格式是 Javascript

application/json: body 數據格式是 JSON

構造 HTTP 請求

通過第三方工具進行構造

使用 postman 就可以構造 HTTP 請求~

每個標簽頁,就是一個構造 HTTP 請求的配置頁面了,點擊 Send 發送按鈕,就能發送請求到目標服務器了~~

還有一個很牛逼的點是:postman 是一個有對象的軟件 == > postwoman~~

通過代碼來構造 HTTP 請求

任何一種編程語言,只要能夠操作網絡,都可以構造 HTTP 請求!!

所謂”發送 HTTP 請求“,本質上就是按照 HTTP 的格式往 TCP Socket 中寫入一個字符串。

所謂”接受 HTTP 響應“,本質上就是從 TCP Socket 中讀取一個字符串,再按照 HTTP 的格式來解析。

我們就可以基于 Socket 的知識,構造出一個簡單的 HTTP 客戶端程序,用來發送各種類型的 HTTP 請求。

public class HttpClient {private Socket socket;private String ip;private int port;public HttpClient(String ip, int port) throws IOException {this.ip = ip;this.port = port;socket = new Socket(ip, port);}public String get(String url) throws IOException {StringBuilder request = new StringBuilder();// 構造首行request.append("GET " + url + " HTTP/1.1\n");// 構造 headerrequest.append("Host: " + ip + ":" + port + "\n");// 構造空行request.append("\n");// 發送數據OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 讀取響應數據InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public String post(String url, String body) throws IOException {StringBuilder request = new StringBuilder();// 構造首行request.append("POST " + url + " HTTP/1.1\n");// 構造 headerrequest.append("Host: " + ip + ":" + port + "\n");request.append("Content-Length: " + body.getBytes().length + "\n");request.append("Content-Type: text/plain\n");// 構造空行request.append("\n");// 構造 bodyrequest.append(body);// 發送數據OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 讀取響應數據InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public static void main(String[] args) throws IOException {HttpClient httpClient = new HttpClient("www.bilibili.com",80);String resp = httpClient.get("/index.html");System.out.println(resp);String postResp = httpClient.post("/index.html","this is a body");System.out.println(postResp);}
}

完!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79140.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用戶&#xff1a;優先使用Caffeine&#xff0c;性能更優且維護活躍。 1. 添加依賴 在pom.xml中添加Guava依賴&#xff1a; <dependency><groupId>com.google.guava</groupId&…

Linux工作臺文件操作命令全流程解析

全文目錄 1 確認當前工作路徑2 導航與目錄管理2.1 關鍵命令2.2 邏輯銜接 3 文件基礎操作3.1 創建 → 備份 → 重命名 → 清理3.2 文件查看和編輯3.3 文件鏈接3.4 文件diff 4 文件權限與所有權管理5 文件打包與歸檔6 參考文獻 寫在前面 shell是一種命令解釋器&#xff0c;它提供…

LeetCode第183題_從不訂購的客戶

LeetCode 第183題&#xff1a;從不訂購的客戶 題目描述 表: Customers ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是該表的主鍵。 該表包含消費者的 id 和…

c語言的常用關鍵字

c語言的常用關鍵字 c語言的關鍵字表示數據類型的關鍵字autocharfloatdoubleintlongshortvoidsignedstruct、enum、unionunsigned 表示分支語句的關鍵字ifelseswitchbreakcasecontinuedefault 表示循環語句的關鍵字whiledoforgoto 用于修飾變量或函數的關鍵字constconst修飾變量…

MCU通用輸入輸出端口(GPIO)設計指南

在嵌入式系統開發中&#xff0c;MCU的GPIO接口是一個基礎但非常實用的功能模塊。GPIO全稱是通用輸入輸出端口&#xff0c;它讓MCU可以靈活地與外部設備進行交互。 GPIO的主要特點包括&#xff1a; 多功能性&#xff1a;每個引腳都可以單獨配置為輸入或輸出 可編程性&#xff…

STM32完整內存地址空間分配詳解

在STM32這類基于ARM Cortex-M的32位微控制器中&#xff0c;整個4GB的地址空間(從0x00000000到0xFFFFFFFF)有著非常系統化的分配方案&#xff0c;每個區域都有其特定的用途。下面我將詳細介紹這些地址區域的分配及其功能&#xff1a; STM32完整內存地址空間分配詳解(0x00000000…

實現水平垂直居中的多種方法

在前端開發中&#xff0c;元素的居中是一個常見但又經常讓人頭疼的問題。本文將全面總結各種CSS居中方法&#xff0c;特別是如何實現一個div的水平垂直居中。 為什么居中這么重要&#xff1f; 居中布局是現代網頁設計中最基礎也最重要的布局方式之一。無論是導航菜單、登錄框…

如何實現服務的自動擴縮容(Auto Scaling)

在云計算和分布式系統的時代,系統的彈性和適應性已成為企業構建高效IT基礎設施的核心需求。自動擴縮容(Auto Scaling)作為一種關鍵技術,旨在根據實時負載變化動態調整計算資源,以確保系統性能穩定,同時優化資源利用效率。簡單來說,自動擴縮容是指系統能夠根據預設規則或…

uniapp+vue3+ts 使用canvas實現安卓端、ios端及微信小程序端二維碼生成及下載

加粗樣式uniapp多端生成帶二維碼海報并保存至相冊的實現 在微信小程序開發中&#xff0c;我們常常會遇到生成帶有二維碼的海報并保存到手機相冊的需求&#xff0c;比如分享活動海報、產品宣傳海報等。今天就來和大家分享一下如何通過代碼實現這一功能。 準備工作 在開始之前&am…

架構師面試(三十八):注冊中心架構模式

題目 在微服務系統中&#xff0c;當服務達到一定數量時&#xff0c;通常需要引入【注冊中心】組件&#xff0c;以方便服務發現。 大家有沒有思考過&#xff0c;注冊中心存在的最根本的原因是什么呢&#xff1f;注冊中心在企業中的最佳實踐是怎樣的&#xff1f;注冊中心的服務…

Day.js和Moment.js對比,日期時間庫怎么選?

在JavaScript的日期處理庫中&#xff0c;Moment.js 和 Day.js 是兩個非常流行的選擇。本文將基于從npmtrends的數據&#xff0c;對這兩個庫進行詳細的對比分析。 Moment.js的重度使用者。凡是遇到時間和日期的操作&#xff0c;就把Moment.js引用上。 直到有天我發現加載的mome…

羅默如何用木星衛星“宇宙鐘表”測量光速?

一、17世紀的“宇宙級實驗” 1676年&#xff0c;丹麥天文學家奧勒羅默&#xff08;Ole Rmer&#xff09;在巴黎天文臺做出驚人發現&#xff1a; 木星衛星的“遲到早退”現象&#xff0c;竟能揭示光速的秘密&#xff01; 通過觀察木衛一&#xff08;Io&#xff09;的軌道周期變…

deepseek 技巧整理

1、導出word 和excel 功能&#xff0c;在使用以下提示詞。 請幫我列出減肥期間可以吃的水果&#xff0c;并分析該水果含有的營養元素&#xff0c;以表格的形式星現。1.要以html的方式輸出 2.要可以直接運行 3.頁面要提供可以直接下載word和excel功能

思考軟件框架

數據庫是達夢數據庫 假定里面有40張表&#xff0c;軟件的業務邏輯比較復雜。 當然&#xff0c;依然是對數據庫中數據的增&#xff0c;刪&#xff0c;改&#xff0c;查&#xff0c;組合&#xff0c;顯示。 但是也涉及到多種軟件&#xff0c;多臺設備之間的通信。 我們可以使用…

探索 Disruptor:高性能并發框架的奧秘

在當今的軟件開發領域&#xff0c;處理高并發場景是一項極具挑戰性的任務。傳統的并發解決方案&#xff0c;如基于鎖的隊列&#xff0c;往往在高負載下表現出性能瓶頸。而 Disruptor 作為一個高性能的并發框架&#xff0c;憑借其獨特的設計和先進的技術&#xff0c;在處理海量數…

前端面經-VUE3篇--vue3基礎知識(一)插值表達式、ref、reactive

一、計算屬性(computed) 計算屬性&#xff08;Computed Properties&#xff09;是 Vue 中一種特殊的響應式數據&#xff0c;它能基于已有的響應式數據動態計算出新的數據。 計算屬性有以下特性&#xff1a; 自動緩存&#xff1a;只有當它依賴的響應式數據發生變化時&#xff…

數據結構6 · BinaryTree二叉樹模板

代碼函數功能順序如下&#xff1a; 1&#xff1a;destroy&#xff1a;遞歸刪除樹 2&#xff1a;copy&#xff1a;復制二叉樹 3&#xff1a;preOrder&#xff1a;遞歸前序遍歷 4&#xff1a;inOrder&#xff1a;遞歸中序遍歷 5&#xff1a;postOrder&#xff1a;遞歸后續遍…

C++/SDL進階游戲開發 —— 雙人塔防游戲(代號:村莊保衛戰 13)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄 十…

強化學習之基于無模型的算法之時序差分法

2、時序差分法(TD) 核心思想 TD 方法通過 引導值估計來學習最優策略。它利用當前的估計值和下一個時間步的信息來更新價值函數&#xff0c; 這種方法被稱為“引導”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡羅方法那樣等待一個完整的 episode 結束才進行更新&…

AE/PR模板 100個現代文字標題動態排版效果動畫 Motion Titles

Motion Titles是一個令人驚艷的AE/PR模板&#xff0c;提供了100個現代文字標題的動態排版效果動畫。這些動畫效果能夠為你的項目增添視覺沖擊力和專業感&#xff0c;為文字標題注入活力和動感。該模板適用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…