周暢 王賾
摘 要:超文本傳輸協(xié)議(HTTP)是分布式、協(xié)作和超媒體信息系統(tǒng)的應(yīng)用協(xié)議。HTTP Server是一個(gè)監(jiān)聽特定端口TPC連接,對客戶端請求進(jìn)行處理的一個(gè)應(yīng)用。得益于高級語言對HTTP協(xié)議的內(nèi)置支持,我們也可以使用簡單的方式來實(shí)現(xiàn)一個(gè)較完整功能的HTTP Server。本文主要是研究一個(gè)HTTP Server的簡單實(shí)現(xiàn),在實(shí)現(xiàn)的過程中,能夠體現(xiàn)出POST、GET方法,現(xiàn)已將要求完成,本文一共分為三個(gè)章節(jié),分別對于此次設(shè)計(jì)進(jìn)行闡述。
關(guān)鍵詞:超文本傳輸協(xié)議服務(wù);萬維網(wǎng);外部應(yīng)用程序
中圖分類號:TP393.0 文獻(xiàn)標(biāo)識碼:A
1 引言(Introduction)
CGI是WWW技術(shù)中最重要的技術(shù)之一,有著不可替代的重要地位。CGI是外部應(yīng)用程序(CGI程序)與Web服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和Web服務(wù)器之間傳遞信息的規(guī)程[1]。CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。使在網(wǎng)絡(luò)服務(wù)器下運(yùn)行外部分應(yīng)用程序(或網(wǎng)關(guān))成為可能。CGI-BIN目錄是存放CGI腳本的地方。這些腳本使Web服務(wù)器和瀏覽器能運(yùn)行外部程序,而無需啟動另一個(gè)程序[2]。
2 項(xiàng)目背景(The project background)
在HTTP中定義了很多和服務(wù)器之間進(jìn)行交互的方法,例如平時(shí)我們所看到的GET、POST、PUT、DELETE[3,4]。其中資源描述符是URL,在這里我們可以這樣理解,一個(gè)URL地址可以描述一個(gè)網(wǎng)絡(luò)上的資源,而前面所提到的HTTP中的,GET、POST、PUT、DELETE所對應(yīng)的分別是這個(gè)資源的查、改、增、刪四個(gè)操作,而這其中的POST一般適用于資源信息的更新,GET用于信息的獲取/查詢,因?yàn)樵缙诘南到y(tǒng)對于DELETE是不支持的,所以說PUT和DELETE用的比較少。
POST方法是HTTP中的一個(gè)重要的組成部分,這種方法一般是用來項(xiàng)目的服務(wù)器發(fā)出更新請求,在請求中附有請求實(shí)體[5]。
在客戶機(jī)和服務(wù)器之間進(jìn)行請求-響應(yīng)時(shí),這兩種方法是最常被用到的。
POST:向指定的資源提交要被處理的數(shù)據(jù),采用這種方法,查詢查詢字符串(名稱/值對)是在POST請求的HTTP消息主體中發(fā)送的。
GET:從指定的資源請求數(shù)據(jù),采用這種方法查詢字符串(名稱/值對)是在GET請求的URL中發(fā)送的[6,7]。
除以上介紹的內(nèi)容之外,這兩種方法在安全性等方面也有一定的區(qū)別,表1列出了兩種方法在具體項(xiàng)目上的區(qū)別。
3 具體實(shí)現(xiàn)(Implementation)
實(shí)現(xiàn)HTTP Server的簡單設(shè)計(jì)有多種語言可以選擇,但是本文采取的是Python語言進(jìn)行設(shè)計(jì)。Python是一種代表簡單主義思想的語言[8]。它的底層是用C語言寫的,很多標(biāo)準(zhǔn)庫和第三方庫也都是用C寫的,運(yùn)行速度非???,無需考慮諸如如何管理你的程序使用的內(nèi)存一類的底層細(xì)節(jié)[9]。
3.1 代碼編寫
程序的代碼編寫主要包括post、get方法實(shí)現(xiàn),以及服務(wù)器的建立,其中在代碼編寫的過程中,post和get的體系基本相同,所以這里只介紹get的方法,post就不再進(jìn)行贅述,其中g(shù)et的代碼思路主要是首先從cgi中將存儲的數(shù)據(jù)調(diào)到form中,接著取出字段名是name的字段,取出字段名是comment的字段,最后打印html,并且加入name comment。除了get、post的編寫之外還有服務(wù)器的建立,大體思路是重寫http server類,然后獲得cgi句柄,接著設(shè)置cgi腳本路徑,最后是監(jiān)聽端口的死循環(huán)。
以上是簡單的介紹一下程序代碼的思路,為了代碼編寫過程中能夠更加的簡潔一些,才會采用Python這種編程語言,下面附上代碼的截圖以及代碼的注釋,以下兩個(gè)圖分別是get和服務(wù)器創(chuàng)建的代碼及注釋,post的不再進(jìn)行重復(fù)。
3.2 軟件實(shí)現(xiàn)
建立在理解以上概念的基礎(chǔ)之上,接下來對于此項(xiàng)目進(jìn)行具體的實(shí)現(xiàn),在創(chuàng)建項(xiàng)目的時(shí)候采用的Python語言,首先介紹一下程序?qū)崿F(xiàn)的流程,程序運(yùn)行開始之后,要建立一個(gè)服務(wù)器,然后創(chuàng)建監(jiān)聽端口,接下來用戶會發(fā)送一個(gè)請求,在接收到用戶的請求之后,要對用戶的請求類型進(jìn)行判斷,因?yàn)樵贖TTP中定義了很多和服務(wù)器之間進(jìn)行交互的方法,如前面提到的GET、POST、PUT、DELETE,但是由于此次項(xiàng)目只是針對GET、POST方法的實(shí)現(xiàn)進(jìn)行設(shè)計(jì),所以說PUT、DELETE在這里不做考慮。
判斷用戶的類型之后,要對用戶的要求進(jìn)行處理,例如,用戶的請求類型是POST,那么接下來要在CGI-BIN中找到相對應(yīng)的腳本,找到腳本之后,對請求進(jìn)行處理,并且將數(shù)據(jù)返回到監(jiān)聽端口,GET類型的流程和POST是一樣的,因?yàn)闆]有涉及DELETE和PUT方法,所以如果用戶的要求是屬于這兩種類型的話,那么將不做任何處理,直接返回到監(jiān)聽端口[10]。
如圖3所示是程序?qū)崿F(xiàn)過程中的流程圖,程序的流程圖主要分為兩個(gè)部分,一個(gè)是主程序的流程圖,另外一個(gè)是在進(jìn)行判斷是后的流程圖。
圖3所顯示的是該程序的主程序流程圖,表現(xiàn)了不管采用的是什么樣的方法,都是按照這樣的流程進(jìn)行,但是正如前面所說的那樣,這個(gè)程序在處理用戶請求的時(shí)候認(rèn)可的是POST和GET兩種方法,所以說當(dāng)用戶的請求是DELETE或者是PUT的時(shí)候,程序是不會進(jìn)行數(shù)據(jù)處理的,如圖4所示請求類型判斷時(shí)候的具體方法。
4 結(jié)論(Conclusion)
在這篇文章中,我們討論實(shí)現(xiàn)HTTP Server的一些方法,并分析了其優(yōu)缺點(diǎn)。經(jīng)過對比,我們針對GET和POST方法進(jìn)行了設(shè)計(jì)。并使用Python語言編寫腳本,對程序進(jìn)行測試,最終實(shí)現(xiàn)簡單HTTP Server的設(shè)計(jì)。
參考文獻(xiàn)(References)
[1] Huang B,Lin H.A Java/CGI Approach to Developing a Geographic Virtual Reality Toolkit on the Internet[J].Computers & Geosciences,2002,28(1):13-19.
[2] Min B,Nahm E,Kim H.An analytic Model of an HTTP
Server[J].Journal of the Electrochemical Society,2002,140(140):1080-1085.
[3] Laliberte D,Hamilton M.Experimental HTTP Methods to Support Indexing and Searching[J].Journal of Biomolecular Structure & Dynamics,1996,1(6):1543-1546.
[4] Demiryurek U,Shahabi C,Banaei-Kashani F.Efficient K-nearest Neighbor Search in Time-Dependent Spatial Networks:US8566030[P].2013.
[5] 劉一峰,劉冰,郭良動.抓取HTTP協(xié)議POST文本數(shù)據(jù)方法設(shè)計(jì)[J].中國科技信息,2016(18):26-27.
[6] 杜雷,辛陽.基于規(guī)則庫和網(wǎng)絡(luò)爬蟲的漏洞檢測技術(shù)研究與實(shí)現(xiàn)[J].信息網(wǎng)絡(luò)安全,2014(10):38-43.
[7] 齊紅心.PHP開發(fā)過程中頁面參數(shù)傳遞方法分析[J].軟件導(dǎo)刊,2016,15(1):6-9.
[8] Salvatier J,Wiecki T,F(xiàn)onnesbeck C.Probabilistic Programming in Python using PyMC[J].Statistics,2015.
[9] Perkel J M.Programming:Pick up Python[J].Nature,2015,
518(7537):125-126.
[10] 狄剛.HTTP實(shí)現(xiàn)代理服務(wù)器及緩存替換算法的研究[D].吉
林大學(xué),2010.
作者簡介:
周 暢(1993-),女,碩士生.研究領(lǐng)域:網(wǎng)絡(luò)安全.
王 賾(1976-),男,博士,副教授.研究領(lǐng)域:網(wǎng)絡(luò)安全.