Http是什么?
基本概念
-
**HTTP是超文本傳輸協(xié)議(HyperText Transfer Protocol)的簡(jiǎn)稱,它建立在C/S架構(gòu)的應(yīng)用層協(xié)議。
**
-
**HTTP、FTP、Telnet等協(xié)議都是建立在TCP/IP協(xié)議基礎(chǔ)上的,而TCP/IP協(xié)議是協(xié)議層的內(nèi)容,它定義了計(jì)算機(jī)間通信的基礎(chǔ)協(xié)議。
**
-
**在HTTP協(xié)議中,客戶端負(fù)責(zé)發(fā)起一個(gè)Request,該Request中含有請(qǐng)求方法、URL、協(xié)議版本等信息,服務(wù)端在接受到該Request后會(huì)返回一個(gè)Response,該Response中含有狀態(tài)碼、響應(yīng)內(nèi)容等信息,這一模型稱為請(qǐng)求/響應(yīng)模型。
**
-
HTTP協(xié)議通信的核心是HTTP報(bào)文,我們將其分為請(qǐng)求報(bào)文和響應(yīng)報(bào)文。其中,由客戶端發(fā)出的HTTP報(bào)文稱為請(qǐng)求報(bào)文,由服務(wù)端發(fā)出的報(bào)文稱為響應(yīng)報(bào)文.
請(qǐng)求報(bào)文:請(qǐng)求報(bào)文通常由瀏覽器來(lái)發(fā)起,當(dāng)我們?cè)L問(wèn)一個(gè)網(wǎng)頁(yè)或者請(qǐng)求一個(gè)資源的時(shí)候都會(huì)產(chǎn)生請(qǐng)求報(bào)文
- 請(qǐng)求報(bào)文通常由HTTP請(qǐng)求行、請(qǐng)求頭、消息體(可選)三部分組成
// 基本請(qǐng)求信息
Request URL: https://www.baidu.com
Request Method: GET
Status Code: 200 OK
Remote Address: 111.206.209.78:443
Referrer Policy: unsafe-url
//請(qǐng)求頭
Accept: application/json, text/javascript, q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: BIDUPSID=344D077FD6A3F97616DBD66A24EBDC96
Host: zhidao.baidu.com
Pragma: no-cache
Referer: https://zhidao.baidu.com/question/366757430246244692.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
X-ik-ssl: 1
X-Requested-With: XMLHttpRequest
//請(qǐng)求參數(shù)
...
請(qǐng)求參數(shù)解析
-
**Host: 請(qǐng)求目標(biāo)的網(wǎng)站
**
-
**Connection: 默認(rèn)為“keep-Alive“,默認(rèn)支持長(zhǎng)連接
**
-
**Cache-Control:這玩意跟緩存有關(guān),其中no-cache表示無(wú)緩存
**
-
**User-Agent:告訴serve 這個(gè)client的身份,一般由瀏覽器決定,比如:瀏覽器類型,版本等等
**
-
**Accept:以及后面的Accept打頭的都是表明client能夠接收的種類和類型
**
-
Cookie:一般會(huì)將登錄的一些信息放在cookie中
響應(yīng)報(bào)文:響應(yīng)報(bào)文是指在服務(wù)端接收并處理了客戶端的請(qǐng)求信息以后,服務(wù)端發(fā)送給客戶端的HTTP報(bào)文
// 響應(yīng)狀態(tài) ,200 表示成功
HTTP/1.1 200 OK
/* 響應(yīng)頭部 */
Access-Control-Allow-Headers: X-ik-ssl,X-ik-token,X-ik-utdata,X-ik-appid,X-ik-cuid,X-ik-fc,X-swan-version,X-ik-tries,X-fail,X-ik-appversion,X-ik-appname,Content-Type,SWAN_UPGRADE_CHECK
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 21
Content-Type: text/html
Date: Fri, 23 Dec 2022 11:49:43 GMT
Not-Try: 0
Server: Apache
Vary: Accept-Encoding
Wait: 2
/* 響應(yīng)信息 */
...
響應(yīng)參數(shù)解析
-
**Http/1.1 200 OK:200表示返回的狀態(tài)碼是正常,OK則是描述性的狀態(tài)碼
**
-
**Date:表示服務(wù)器響應(yīng)的時(shí)間
**
-
**Server: 響應(yīng)客戶端的服務(wù)器。
**
-
**Content-Length:表示服務(wù)器返回給客戶端正文的字節(jié)流長(zhǎng)度
**
-
**Content-Type:表示正文的類型
**
-
Content-Encoding:文檔類型的編碼方式,服務(wù)器端采用gzip的形式進(jìn)行了文檔壓縮
Http的基本應(yīng)用
常見的方法有GET、POST 兩種http請(qǐng)求方式
-
**GET:最為常見的一種請(qǐng)示方式。當(dāng)客戶端從服務(wù)器讀取文檔或者通過(guò)一個(gè)鏈接來(lái)訪問(wèn)頁(yè)面的時(shí)候,都是采用GET方式來(lái)請(qǐng)求的
**
-
**POST:POST克服了GET方式對(duì)參數(shù)長(zhǎng)度存在限制的缺點(diǎn),以鍵-值形式將參數(shù)封裝在HTTP請(qǐng)求中,所以從理論上講它對(duì)參數(shù)長(zhǎng)度沒(méi)有限制,但是實(shí)際上各個(gè)服務(wù)器會(huì)規(guī)定對(duì)POST提交數(shù)據(jù)大小進(jìn)行限制;
**
-
注: POST的安全性比GET的高,因?qū)τ脩魜?lái)講參數(shù)傳遞過(guò)程是不可見的。 類似用戶登錄之類的基本都是采用post形式
HTTP中的五種響應(yīng)碼
- 1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理
- 2xx:成功--表示請(qǐng)求已被成功接收、理解、接受
- 3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
- 4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
- 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
!
編輯
HttpWebRequest 簡(jiǎn)單的HTTP請(qǐng)求案例
GET方式:
public static string doGet()
{
string url="www.baidu.com";
//創(chuàng)建
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
//設(shè)置請(qǐng)求方法
httpWebRequest.Method = "GET";
//請(qǐng)求超時(shí)時(shí)間
httpWebRequest.Timeout = 30000;
//發(fā)送請(qǐng)求
HttpWebResponse response=null;
Stream s = null;
StreamReader sRead = null;
string postContent = null;
try
{
//獲得響應(yīng)流
response = (HttpWebResponse)httpWebRequest.GetResponse();
s = response.GetResponseStream();
sRead = new StreamReader(s);
postContent = sRead.ReadToEnd();
}
catch (WebException ex)
{
response = ex.Response as HttpWebResponse;
log.Error(ex.Message.ToString(), ex);
}
finally
{
if(sRead != null)
{
sRead.Close();
}
if(s != null)
{
s.Close();
}
if(response != null)
{
response.Close();
}
}
return postContent;//返回Json數(shù)據(jù)
}
POST方式:
public static string doPost()
{
string strURL = "wwww.baidu.com";
//創(chuàng)建一個(gè)HTTP請(qǐng)求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
//Post請(qǐng)求方式
request.Method = "POST";
//內(nèi)容類型
request.ContentType = "application/json";
request.Accept = "application/json";
//將Json字符串轉(zhuǎn)化為字節(jié)
byte[] payload = System.Text.Encoding.UTF8.GetBytes(jsonParas);
//設(shè)置請(qǐng)求的ContentLength
request.ContentLength = payload.Length;
//發(fā)送請(qǐng)求,獲得請(qǐng)求流
Stream writer;
try
{
writer = request.GetRequestStream();//獲取用于寫入請(qǐng)求數(shù)據(jù)的Stream對(duì)象
}
catch (Exception ex)
{
log.Error("連接服務(wù)器失敗!" + ex.Message.ToString(), ex);
throw ex;
}
//將請(qǐng)求參數(shù)寫入流
writer.Write(payload, 0, payload.Length);
writer.Close();//關(guān)閉請(qǐng)求流
HttpWebResponse response = null;
Stream s = null;
StreamReader sRead = null;
string postContent = null;
try
{
//獲得響應(yīng)流
response = (HttpWebResponse)request.GetResponse();
s = response.GetResponseStream();
sRead = new StreamReader(s);
postContent = sRead.ReadToEnd();
}
catch (WebException ex)
{
response = ex.Response as HttpWebResponse;
log.Error(ex.Message.ToString(), ex);
}
finally
{
if (sRead != null)
{
sRead.Close();
}
if (s != null)
{
s.Close();
}
if (response != null)
{
response.Close();
}
}
return postContent;//返回Json數(shù)據(jù)
}
-
HTTP
+關(guān)注
關(guān)注
0文章
511瀏覽量
31518 -
傳輸協(xié)議
+關(guān)注
關(guān)注
0文章
78瀏覽量
11492 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
519瀏覽量
25551
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論