最近在搞OSS對象存儲,發現了自身的一些不足,趁着有空在此做個總結,希望能夠幫助到大家!!!
首先解釋下OSS,Object Storage Service(對象存儲服務),一般的雲公司,都會提供OSS的。說的通俗點,就是遠端伺服器提供一定的空間專門來存儲檔案的,這些檔案可以直接通過url任意時間,任意地點通路。
而把檔案存儲到OSS空間裡,就是使用的http協定。OSS中的Bucket就是Windows系統下的檔案夾。
一、http原理
我們知道http協定是基于TCP/IP協定的,也就是說,通過http進行資料傳輸,首先需要進行TCP連接配接。TCP連接配接需要進行三次握手,斷開連接配接需要進行四次揮手。
關于TCP的三次握手跟四次揮手,話不多說,直接推薦,人家已經寫的很好了。 無需我多說廢話。
TCP的三次握手
TCP的四次揮手
握手要稍微了解一下的,不然可能無法了解下面的keep-alive。
想了解https原理的,推薦徹底搞懂https原理
http請求資訊

http的請求封包,就是發送給服務端的資訊,主要包含三個部分:請求行、請求頭部、請求資料
(借用别人的圖)
請求行主要包含請求方法(GET,POST,PUT,DELETE),URL跟http協定版本
請求頭部:
在這裡,稍微了解一下
Accept指的是,本次請求,接受哪些格式的檔案
Accept-Encoding :接受的檔案壓縮格式
Host :域名,主機名
比較重要的請求頭部
Connection :采用的連接配接方式
Content-Type(請求編碼方式): application/x-www-form-urlencoded(隻能是鍵值對方式) application/form-data(可以包含檔案)
Content-Length(請求資料長度): 35
Authorization(認證):當我們需要通路其他公司提供的服務接口時,必須要有這個簽名認證。
有興趣可以了解一下http協定版本
在1.0版本下,每次發送一個請求時都要進行一次TCP三向交握,然後再進行資料傳輸,TCP連接配接消耗成本較高。為了能夠複用TCP的連接配接,
因而誕生了1.1版本,主要的變化就是可以進行持久連接配接,也就是說,一次TCP連接配接可以發送多個http請求,但服務端仍然一次隻能處理一個請求,依次進行。隻需設定請求頭部的Connection的值為keep-alive,即可。如果超過一定的時間沒有繼續發送http請求,TCP連接配接會自動關閉,當然也可以設定主動關閉。
至于未來的2.0版本,最大的變化便是增加雙工模式,使用多路複用技術,也就是說不僅用戶端能夠同時發送多個請求,服務端也能同時處理多個請求
2.0版本的還沒捂熱,3.0已經來了,學不動了呀。至于3.0是個什麼情況,小爺也不知道。
http響應資訊
http的響應封包就是服務端給http請求的回應資訊,主要包含狀态行、響應頭部、響應資料。
1 狀态行:協定版本、狀态碼、簡要描述,例如:HTTP/1.1 200 OK
常見的狀态碼:200,一切正常 400,用戶端錯誤 404,相關資源檔案未找到 500,服務端錯誤
2 響應頭部:例如:Content-Type: text/plain,json等
3 響應資料:即伺服器回應用戶端的内容。如果我們請求網頁,則傳回網頁内容,如果隻是單純請求資料,則傳回相應的資料。
二、.NET中提供的相應的API
WebRequest,HttpWebRequest, WebResponse,HttpWebResponse
這幾個類做爬蟲的話,也經常用到的。可能很多人被這幾個類搞混了。鄙人也是的,怎麼這麼多類,好像還有什麼WebClient等。。。
WebRequest類,這個類是一個抽象類,是對URI送出請求而進行了一種抽象,跟動物是對狗狗、貓咪、小老鼠等的一種抽象是一個道理。
面向對象的思想很是偉大,他來源于真實世界的抽象,當然我們也可以用面向對象的思想來反觀世界。
很是精彩!!!
HttpWebRequest類,這個類是WebRequest類的派生類,專門用于進行http特定的實作。裡面有相應的屬性和方法。
WebResponse HttpWebResponse 同理。
//請求
HttpWebRequest request =(HttpWebRequest)WebRequest.Create("http://www.contoso.com/");
request.KeepAlive = false;//設定是否為持久連接配接
request.Method = "POST";
string authorization="";//擷取認證簽名
request.Headers.Add("Authorization", authorization);//将認證簽名添加到請求頭部
Stream requestStream = request.GetRequestStream();//擷取請求流
string postData = "nickName=打遊戲也要有夢想&hobby=coding";//添加請求資料
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] byte1 = encoding.GetBytes (postData);
request.ContentType = "application/x-www-form-urlencoded";//請求編碼方式
request.ContentLength = byte1.Length;//請求資料長度
requestStream.Write (byte1, 0, byte1.Length);//給請求流中添加請求資料
requestStream.Close();//關閉請求流
//響應
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();//擷取響應流
StreamReader readStream = new StreamReader (responseStream, Encoding.UTF8);//讀取響應流
string responseText=readStream.ReadToEnd();//響應資訊
response.Close ();
readStream.Close ();
三、流的概念
http協定傳輸的資料其實就是通過流來傳輸的。流這東西,有資料流、檔案流、讀寫流等,的确很是抽象,不知道到底是個什麼東西,搞了半天,發現被這個高大上的名字給忽悠了。
所謂的流呢,其實就是位元組序列,就是位元組數組。搞後端的應該都知道,需要将傳回的對象進行序列化後再傳輸到前端。其中的序列化,便是将對象轉為位元組序列(流),來進行傳輸。這麼說吧,http傳輸的資料都是通過流來傳輸的。
那大家可能會有個問題,http協定中是怎麼上傳下載下傳檔案的,通過類HttpWebRequest,我們得到一個對象,接下來我們得到請求流,然後把檔案添加到這個請求流裡,便可以了;同理,下載下傳檔案也是如此,得到響應流,然後将流寫入到一個建立的檔案流便可以了。
//通過http上傳檔案,隻需在請求流中寫入需要上傳的檔案 fileStream為需要上傳的檔案轉為流的形式
Stream requestStream = request.GetRequestStream();//請求流
//上傳檔案
byte[] buffer = new byte[64 * 1024];//設定緩存區大小,據說64KB最好(隻是據說,沒有親測)
int read = fileStream.Read(buffer, 0, buffer.Length);
while (read > 0)
{
requestStream.Write(buffer, 0, red);//在請求流中繼續寫入檔案流
read = fileStream.Read(buffer, 0, buffer.Length);
}
//關閉流
fileStream.Close();
requestStream.Close();
//通過http下載下傳檔案,隻需将響應流中寫入到建立的檔案流中
Stream responseStream = response.GetResponseStream();//擷取響應流
string fileName="";//建立的檔案名,包含路徑名稱和檔案名以及字尾
FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);//建立檔案流
byte[] buffer = new byte[64 * 1024];//設定緩存區大小,據說64KB最好(隻是據說,沒有親測)
int totalSize = 0;//檔案總大小
int size = responseStream.Read(buffer, 0, buffer.Length);
while (size > 0)
{
totalSize += size;
fileStream.Write(buffer, 0, size);//将響應流中寫入到建立的檔案流中
size = responseStream.Read(buffer, 0, buffer.Length);
}
fileStream.Close();
responseStream.Close();
四、認證簽名
關于簽名的,肯定會涉及到一些加密算法,base64,sha1,md5等這些算法,這些算法并不需要我們去掌握,.NET已經提供了相應的API,隻需會調用即可,沒必要去深究到底是怎麼實作的。
使用其他公司提供的接口服務,都會有相應的公鑰和私鑰,按照官網文檔來生成相應的認證簽名就可以了。然後将認證簽名添加到請求頭部裡,便可以通路其他公司提供的接口服務了。
一般生成簽名的接口需要在自己的服務端自己寫一個,得到的簽名與其他公司服務端生成的簽名進行比對。
五、最後
最後祝大家國慶快樂,玩得開心,國慶Happy!!!