Http是什么?
基本概念
-
**HTTP是超文本傳輸協(xié)議(HyperText Transfer Protocol)的簡稱,它建立在C/S架構(gòu)的應(yīng)用層協(xié)議。
**
-
**HTTP、FTP、Telnet等協(xié)議都是建立在TCP/IP協(xié)議基礎(chǔ)上的,而TCP/IP協(xié)議是協(xié)議層的內(nèi)容,它定義了計算機間通信的基礎(chǔ)協(xié)議。
**
-
**在HTTP協(xié)議中,客戶端負(fù)責(zé)發(fā)起一個Request,該Request中含有請求方法、URL、協(xié)議版本等信息,服務(wù)端在接受到該Request后會返回一個Response,該Response中含有狀態(tài)碼、響應(yīng)內(nèi)容等信息,這一模型稱為請求/響應(yīng)模型。
**
-
HTTP協(xié)議通信的核心是HTTP報文,我們將其分為請求報文和響應(yīng)報文。其中,由客戶端發(fā)出的HTTP報文稱為請求報文,由服務(wù)端發(fā)出的報文稱為響應(yīng)報文.
請求報文:請求報文通常由瀏覽器來發(fā)起,當(dāng)我們訪問一個網(wǎng)頁或者請求一個資源的時候都會產(chǎn)生請求報文
- 請求報文通常由HTTP請求行、請求頭、消息體(可選)三部分組成
// 基本請求信息
Request URL: https://www.baidu.com
Request Method: GET
Status Code: 200 OK
Remote Address: 111.206.209.78:443
Referrer Policy: unsafe-url
//請求頭
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
//請求參數(shù)
...
請求參數(shù)解析
-
**Host: 請求目標(biāo)的網(wǎng)站
**
-
**Connection: 默認(rèn)為“keep-Alive“,默認(rèn)支持長連接
**
-
**Cache-Control:這玩意跟緩存有關(guān),其中no-cache表示無緩存
**
-
**User-Agent:告訴serve 這個client的身份,一般由瀏覽器決定,比如:瀏覽器類型,版本等等
**
-
**Accept:以及后面的Accept打頭的都是表明client能夠接收的種類和類型
**
-
Cookie:一般會將登錄的一些信息放在cookie中
響應(yīng)報文:響應(yīng)報文是指在服務(wù)端接收并處理了客戶端的請求信息以后,服務(wù)端發(fā)送給客戶端的HTTP報文
// 響應(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)的時間
**
-
**Server: 響應(yīng)客戶端的服務(wù)器。
**
-
**Content-Length:表示服務(wù)器返回給客戶端正文的字節(jié)流長度
**
-
**Content-Type:表示正文的類型
**
-
Content-Encoding:文檔類型的編碼方式,服務(wù)器端采用gzip的形式進(jìn)行了文檔壓縮
Http的基本應(yīng)用
常見的方法有GET、POST 兩種http請求方式
-
**GET:最為常見的一種請示方式。當(dāng)客戶端從服務(wù)器讀取文檔或者通過一個鏈接來訪問頁面的時候,都是采用GET方式來請求的
**
-
**POST:POST克服了GET方式對參數(shù)長度存在限制的缺點,以鍵-值形式將參數(shù)封裝在HTTP請求中,所以從理論上講它對參數(shù)長度沒有限制,但是實際上各個服務(wù)器會規(guī)定對POST提交數(shù)據(jù)大小進(jìn)行限制;
**
-
注: POST的安全性比GET的高,因?qū)τ脩魜碇v參數(shù)傳遞過程是不可見的。 類似用戶登錄之類的基本都是采用post形式
HTTP中的五種響應(yīng)碼
- 1xx:指示信息--表示請求已接收,繼續(xù)處理
- 2xx:成功--表示請求已被成功接收、理解、接受
- 3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作
- 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn)
- 5xx:服務(wù)器端錯誤--服務(wù)器未能實現(xiàn)合法的請求
!
編輯
HttpWebRequest 簡單的HTTP請求案例
GET方式:
public static string doGet()
{
string url="www.baidu.com";
//創(chuàng)建
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
//設(shè)置請求方法
httpWebRequest.Method = "GET";
//請求超時時間
httpWebRequest.Timeout = 30000;
//發(fā)送請求
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)建一個HTTP請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
//Post請求方式
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è)置請求的ContentLength
request.ContentLength = payload.Length;
//發(fā)送請求,獲得請求流
Stream writer;
try
{
writer = request.GetRequestStream();//獲取用于寫入請求數(shù)據(jù)的Stream對象
}
catch (Exception ex)
{
log.Error("連接服務(wù)器失敗!" + ex.Message.ToString(), ex);
throw ex;
}
//將請求參數(shù)寫入流
writer.Write(payload, 0, payload.Length);
writer.Close();//關(guān)閉請求流
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文章
501瀏覽量
31065 -
傳輸協(xié)議
+關(guān)注
關(guān)注
0文章
78瀏覽量
11439 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
509瀏覽量
25447
發(fā)布評論請先 登錄
相關(guān)推薦
評論