預習課件12goweb編程基礎一_第1頁
預習課件12goweb編程基礎一_第2頁
預習課件12goweb編程基礎一_第3頁
預習課件12goweb編程基礎一_第4頁
預習課件12goweb編程基礎一_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

GoLand2019.2熟悉GoWeb編程包,socket、net/http目前Go社區(qū)已經有非常多關于Wb開發(fā)的庫或框架。大而全的有beego、revel、iris。性能的有echo、fasthttp、gn(目前GHub星標最多)。還有不少專注于具體某個方面的,最多要屬路由了,例如:mux、http/http包開始呢?因為這些庫/net/http包做了包裝,提供易于使用的功能,如路由參數(/:name/:age)/路由分組等。熟練掌握了基礎知識和身服務,返回HTTPResponse(響應)包;客戶端收到來自服務?的響應后開始渲染這個 相應的對應的IP,然后通過I地址找到IP對應的服務?后,要求建立TCP連接,等瀏覽?發(fā)送完覽?(其實端客戶端內部也是瀏覽?實現(xiàn)的)。Web服務?的工作原理可以簡單地歸納為:用動態(tài)語言的解釋引擎負責處理“動態(tài)內容”,并將處理得到的數據返回給客戶端第一次請求url,服務?返回的是html頁面,然后瀏覽?開始渲染HTML。當解析到HTMLDOM里URL和DNS“統(tǒng)一資源定位符”的英文縮寫,用于描述一個網絡上的資源,基本格式如下指定低層使用的協(xié)議(例如httphttps,ftp)query-錨h :這個 名,由服務?名 7、/index.html:這個叫做URL?DNS HTTP什么是HTTPHTTP協(xié)議是HyperTextTransferProtocol(超文本傳輸協(xié)議)的縮寫是個基于TCP/IP通信協(xié)議來傳送實體的信息,如:Content-Type、Content-ength、Date等。當瀏覽?接收并顯示網頁前,此網頁所在的服務?會返回一個包含HTTP狀態(tài)碼的信息頭(serverheader)用以響應瀏覽?的請求。HTTP由請求行HTTP協(xié)議//HTTP/1//請求行:請求方法請求Accept:application/x-ms-applicationimage/jpeg,application/xaml+xml,image/gif,image/pjpeg,application/xms-xbap,*/*User-Agent:Mozilla/4.(compatible;MSIE8.0;WindowsNT6.1;Win64;x64;Trident/4.0;.NETCLR20.50727;SLCC2;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;.NET4.0C;.NET4.0E)UA-CPU:Accept-Encoding:gzip Host Connection:Keep-HTTPHTTP/1.1200Server:Content-Type:text/html;charset=UTF-8Connection:keep-alive

:PHPSE =mjup58ggbef7i9 7908kub;path=/;HttpOnlyCache-Control:no-cacheDate:Wed,14Nov2080827:32 Content-Length: <!DOCTYPE 態(tài)碼,狀態(tài)碼由三位數字組成,第一個數字定義了響應的類別。(HTTP狀態(tài)碼的英文為HTTPStatusBad//請 ,這個狀態(tài)代碼必須和403 NotInternalServerServer網頁之間沒有任何聯(lián)系。HTTP是一個無狀態(tài)的面向連接的協(xié)議,無狀態(tài)不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協(xié)議(面對無連接)HTTP/1.1起,默認都開啟了Keep-Alive保持不會永久保持連接,它有一個保持時間,可以在不同服務?軟件(如Apache)中設置這個時間。 應著對這個資源的查,改,增,刪4個操作。GET和POSTGET參數通過URL傳遞,POST放在Requestbody中。continue,瀏覽?再發(fā)送data,服務?響應200ok(返回數據))HTTPS認證確認的真實性Https和HttpIPTCPUDPUDP用戶數據報協(xié)議,UserDatagramProtocolUDP是OSI(OpenSystemInterconnection,開放式系統(tǒng)互聯(lián))TCP是面向連接的傳輸控制協(xié)議,提供可靠的數據服務(類似于打)UDP是提供無連接的數據報服到點的連接,UDPTCP邏輯通信信道是全雙工的可靠信稱為半雙工;信息能夠同時雙向傳送則稱為全雙工。TCPtcp-ip- ////TCPserverfuncprocess(conndeferconn.Close關閉連接for{reader:=bufio.NeReader(conn)varbuf[128]byten,err:=reader.Read(buf[:])iferr!=nilfmt.Println("readfrom failed,err:",err)}recvStr:= 端發(fā)來的數據:",recvStr)conn.Write([]byte(recvStr))//發(fā)送數據}}funcmain()listen,err:=net.Listen("tcp",":20000")iferr!=nil{fmt.Println("listenfailed,err:",err)}forconnconnerr:listen.Acceptiferr!=nilfmt.Println("acceptfailed,err:",err)}goprocess(conn啟動一個goroutine}}端////funcmain()conn,err:=net.Dial("tcp",":20000")iferr!=nil{fmt.Println("err:",err)}deferconn.Close()//關閉連接inputReader:bufio.NewReader(os.Stdin)for{input_:inputReader.ReadString('\n inputInfo:=strings.Trim(input,ifstrings.ToUpper(inputInfo"Q"如果輸入q}_errconn.Writebyte(inpuInfo發(fā)送數據iferr!=nil{}buf:=n,err:=conn.Read(buf[:])iferr!=nil{fmt.Println("recvfailed,err:",err)}}}WebSocketprotocol是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽?與服務?全雙工通信,能更好的節(jié)省服WebSocket是一種雙向通信協(xié)議,在建立連接后,WebSocket服務?和Browser/Agent都能主動的向對方發(fā)送或接收數據,就像Socket一樣;http--websocket--上圖對比可以看出,相對于傳統(tǒng)HTTP每次請求-應答都需要客戶端與服務端建立連接的模式,WebSocket是類似SocketTCP長連接的通訊模式,一旦WebSocket連接建立后,后續(xù)數據都以幀WebSocket連接過程(握手RemoteProcedureCall過程調用它是一種通過網絡從計算機程序上請求服務,而不需rpc- RPCvs來的電?是因為電是可以傳輸的。至于用銅線還是用鐵絲還是其他種類的導線,也就是用http還Rest&Rest全稱是RepresentationalStateTransfer,中文意思是表述性狀態(tài)轉移。Rest指的是一組架構約束條件和原則。如果一個架構符合Rest的約束條件和原則我們就稱它為Restful架構。RestfulAPI//新//查 oWeb?。?0分鐘接下來,我們來編寫一個Web版本的" oWorld"程序。使用Go語言提供的net/http包。創(chuàng)建server.go文件,輸入下面內容:packagepackageimport) o(whttp.ResponseWriter,r*http.Request){fmt.Fprintf(w," o,Web!")}funcmain()iferr:=http.ListenAndServe(":8080",nil);err!{}}o ,輸入命令:gorunervergo,我們的第一個服務?程序就跑起來了。之后打開瀏覽?,輸入localhost:880,"ello,Web!"就在網頁上顯示出來了。o

函數到根路徑/上 //////DefaultServeMuxisthedefaultServeMuxusedbyServe.varDefaultServeMux=&dfaultServeuxvardefaultServeMux道,HandleFunc是為指定的URL一個處理?(準確來說, ////funcHandleFunc(patternstring,handlerfunc(ResponseWriter,{DefaultServeMux.HandleFunc(pattern,}

////funcListenAndServe(addrstring,handler server:=&Server{Addr:addr, handler}returnserver.ListenAndServe()}typetypeserverHandlerstruct{srv*Server}func(shserverHandler)ServeHTTP(rwResponseWriter,req*Request){handler:=sh.srv.Handlerifhandler==nil{handler=DefaultServeMux}handler.ServeHTTP(rw,}的方法。在ServeHTTP方法中,根據URL查找我們的處理?然后將請求交由它處理個全局變量,所有代碼,包括第代碼都可以修改它。有些第代碼會在DefaultServeMux創(chuàng)建多路復用創(chuàng)建多路復用?也比較簡單直接調用http.NewServeMux方法即可。然后,在新創(chuàng)建的多路復用?上packagepackage("fmt")o(whttp.ResponseWriter,r{fmt.Fprintf(w, o,}funcmain()//創(chuàng)建mux:= serverserver:=&http.Server{Addr:Handlermux, }iferr:=server.ListenAndServe();err!={}serverserver:=&http.Server{Addr: 1*time.Second, 1*構,Handler接口定義在net/http包中:////src/net/http/server.gotypeHandlerinterface{funcServeHTTP(wReponse.Writer,r}packagepackageimport)typeGreetingHandler{Language}funcfunc(hGreetingHandler)ServeHTTP(whttp.ResponseWriter,r{fmt.Fprintf(w,"%s",}funcmain()mux:= ",GreetingHandler{Language:"你好"})mux.Handle("/english",GreetingHandler{Language:" server:={Addr:Handler:}iferr:=server.ListenAndServe();err!={}}到多路復用?的/ o和/world路徑上。注意,這里使用的是Handle方法,注意與啟動服務?之后,在瀏覽?的地址欄中輸入localhost:88/ ,瀏覽?中將顯示你好,輸入localhost:8080/english將顯示 為了方便使用,net/http包提供了以函數的方式處理?,即使用HandleFunc。函數必須滿足簽名:func(whttp.ResponeWrier,r*http.Request。這個函數稱為處理?函數。////func(mux*ServeMux)HandleFunc(patternstring,handler*Request))ifhandler=={panic("http:nil}mux.Handle(pattern,HandlerFuncfuncwResponseWriter,r*Request)的新類型,它可以自定義其方類型實現(xiàn)了類型,最終使用////typeHandlerFuncfunc(w*ResponseWriter,rfunc(fHandlerFunc)ServeHTTP(wResponseWriter,r*Request){f(w,r)}HandlerFuncfuncwResponseWriter,r*Request)URL哪個處理?的呢?例如,我們現(xiàn)在綁定了3個URL,/和/o和/ o/world。URL為,則調用對應的處理? 但是,如果請求的是/o/othrs那么使用哪一個處理?呢?匹配遵循以下規(guī)則如果沒有,繼續(xù)執(zhí)行這一步。即查找對應的處理?。請求的URL只有前綴與被綁定的URL相同,ServeMux也認為它們是匹配的。的處理?時,就會退而求其次,開始尋找能夠與/o/匹配的處理?。packagepackage("fmt"))funcindexHandler(whttp.ResponseWriter,r{fmt.Fprintf(w,"Thisistheindex}oHandler(whttp.ResponseWriter,r{fmt.Fprintf(w,"Thisis o}funcworldHandler(whttp.ResponseWriter,r{fmt.Fprintf(w,"Thisistheworld}funcmain()mux:=http.NewServeMux()mux.HandleFunc("/",indexHandler)o/world",server:=&http.Server{Addr:Handler:}iferr:=server.ListenAndServe();rr!={}瀏覽?localhost:8080/"Thisistheindexpage",因為瀏覽?請求localhost:8080/ o將返回"Thisistheopage",因為/ o/將返回"Thisistheindexpage"。注意這里 o,因為綁定的/o需要精確匹配,而請求的/o/不能與之精確匹配。故而向上查找到/;瀏覽?請求localhost:8080/ o/world將返回"Thisistheworldpage",因為/ o/world精確匹配;瀏覽?localhost:8080/o/world"Thisistheindexpage,查找步驟/o/world(不能與/o/world精確匹配)->/o/(/o精確匹配)->/;瀏覽?請求localhost:8080/ o/other將返回"Thisistheindexpage",查找步驟為/ o/others->/ o/(不能與/ o精確匹配)->/;如果時,將 o改為 o/world/都將返回"Thisistheopage"。自己試試吧funcfunc(whttp.ResponseWriter,r*ttp. 定義在包net/http////typeRequeststruct{ //省略一些字段}信息(用戶基本信息,商品信息等),POST方法創(chuàng)建新的資源(新用戶,上架新商品等)。為統(tǒng)一資源標識符(URI,UniformResourceIdenti?er)。URI由兩部分組成。一部分表示資源的名稱,即統(tǒng)一資源名稱(URN,UniformResourceName)。另一部分表示資源的位置,即統(tǒng)一資源定位符(URL,UniformResourceLocation)。 0,127.001:880path:資源在主機上的路徑,以分隔,如用&連接,如page=1&count=10;沒有這部分信息。但是可以通過ajax等代碼的方式發(fā)送這個數據;anan////net/url/url.gotypeURLstruct }章講的Web程序基本結構,只需要增加處理?函數和即可):funcfuncurlHandler(whttp.ResponseWriter,r*http.Request)URL:=fmt.Fprintf(w,"Scheme:%s\n",URL.Scheme)fmt.Fprintf(w,"Host:%s\n",URL.Host)fmt.Fprintf(w,"Path:%s\n",URL.Path)fmt.Fprintf(w,"Ra th:%s\n",URL.Ra fmt.Fprintf(w,"RawQuery:%s\n",URL.RawQuery)fmt.Fprintf(w,"Fragment:%s\n",}mux.HandleFunc("/url",Path:/url/posts RawQuery:page=1&count=10////URLspecifieseithertheURIbeigrequested(for//requests)ortheURLtoaccess //ForserverrequeststheURLisparsedfromthe dontheRequest-LineasstoredinRequestURI.//mostrequests,fieldsotherthanPathandRawQuerywill//empty.(SeeRFC7230,Section// requests,theURL'sHostspecifiestheserver//connectto,whiletheRequest'sHostfield//specifiestheHostheadervaluetosendinthe//我們還可以通過URL結構得到一個URL字符串:URLURL:=&net.URL},funcfuncprotoFunc(whttp.ResponseWriter,r*http.Request)fmt.Fprintf(w,"Proto:%s\n",r.Proto)fmt.Fprintf(w,"ProtoMajor:%d\n",rProtoMajor)fmt.Fprintf(w,"ProtoMinor:%d\n",r.PotoMinor)}mux.HandleFunc("/proto",protProtoProto:HTTP/1.1ProtoMajor:1ProtoMinor://typeHeader發(fā)起funcfuncheaderHandler(whttp.ResponseWriter,r*http.Request){forkey,value:=ranger.Header{fmt.Fprintf(w,"%s:%v\n",key,}}mux.HandleFunc("/header",請求Accept-Enreading:Accept-Enreading:[gzip,deflate,br]Sec-Fetch-Site:[none]Sec-Fetch-Mode:[navigate]Connection:[keep-alive]Upgrade-Insecure-Requests:[1]User-Agent:[Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.1904.108Safari/537.36]Sec-Fetch-User:[?1][text/html,application/xhtml+xml,application/xml;q09Accept-Language: ,zh;q=0.9,en-US;q=0為User-Agent:用于描述發(fā)起請求的客戶端信息,如什么瀏覽為現(xiàn)了Body字段是一個io.ReadCloser接口。在之后要關閉它,否則會有資源泄露??梢允筬uncfuncbodyHandler(whttp.ResponseWriterr*http.Requestdata:=make([]byte,r.ContentLength)r.Body.Read(data)//忽略錯誤處理deferfmt.Fprintln(w,}mux.HandleFunc("/body",datadata,_:=funcfuncindexHandler(whttp.ResponseWriter,r*http.Request){fmt.Fprint(w,`<title>Go<formmethod="post"<labelfor="username"><inputtype=text"id="username"<label <inputtype="text" " <buttontype="submit">提交}mux.HandleFunc("/",URLquerystring;URL形如key1=value1&key2=value2。funcfuncqueryHandler(whttp.ResponseWiter,r*http.Request){fmt.Fprintln(w,r.URL.RawQuery)}mux.HandleFunc("/query,localhost:8080/query?name=ls&age=20name=ls&age=20會傳回客。編寫一個<title>Go<formaction="/form?lang=cpp&name=ls"method="post"<input<inputtype="text"name="lang"<inputtype="text"name="age"<buttontype="submit">提交法沒有請求體,參數將會拼接到URL尾部;送文件,必須指定為multipart/form-data;為20,故URL編碼為%20。使用x-www-form-urlencoded編碼的請求體,在處理時首先調用請求 從Form字段中取數據:funcfuncformHandler(whttp.ResponseWriter,r*http.Request){fmt.Fprintln(w,}mux.HandleFunc("/form",ormHFormurl.Valuesmap[string][]stringParseForm方法之后,可以使用url.Values的方法操作數據。<title>Go<formaction="/form?lang=cpp&name=ls"method="post"<inputtype="text"name="lang"<inputtype="text"name="age"<buttontype="submit">提交[golangcpp[golangcpp使用PostForm只會返回表單數據,不包括URL鍵值。multipart/form-dataForm/PostForm類似,處理multipart/form-data編碼的請求時,也需要先解析后使用只不過使用的方法不同,解析使用ParseMultipartForm,之后從MultipartForm字段取值。<form<formaction="/multipartform?lang=cpp&name=dj"method=pst"<inputtype="text"name="lang"<inputtype="text"name="age"<inputtype="file"name="uploaded<buttontype="submit">提交funcmultipartFormHandlr(whttp.ResponseWriter,r*http.Request){fmt.Fprintln(w,file,err:=fileHeader.Open()iferr!=nilfmt.Println("Openfailed:",err)}data,err:=ioutil.ReadAll(file)iferr==nil{fmt.Fprintln(w,}}mux.HandleFunc("/multipartform",是multipart.FileHeader類型,通過該類型可以獲取文件的各個屬性。用ParseForm/ParseMultipartForm方法。果需要獲取全部值,直接使用Form字段。下面代碼將返回o對應的第一個值:fmtfmt.Fprintln(w,PostFormValuePostForm字段中指定鍵的值如果同一個鍵對應多個值,那么返回第一個。如果需要獲取全部值,直接使用PostForm字段它們的是Form/PostForm字段,而ParseMultipartForm將數據寫入MultipartForm字段。通過r.Body字節(jié)流;funcfunc(whttp.ResponseWriter,r////typeReponseWriter{Header()HeaderWrite([]byte)(int,error)WriteHeader(statusCodeint)}WriteWriteHeaderResponseWriterWriteyteiterror////typeWriterinterfaceWrite(p[]byte)(nit,err}http.ResponseWriter類型的變量w能在下面代碼中使用的原因(fmt.Fprintln的第一個參數接收一個io.Writer接口):fmtfmt.Fprintln(w,ofuncfuncwriteHandler(whttp.ResponseWriter,r*http.Request){str:=`<html><head><title>Go<body><h1>直接使用Write方法}mux.HandleFunc("/write",些操作才能查看,不夠直觀。curl是一個Linux命令行程序,可用來發(fā)起HTTP請求,功能非常強直接在curl官網可執(zhí)行程序,完成后放在PATH 中即可在Cmd或Powers Windows提供了一個軟件包管理工具chocolatey,類似mac上的Homebrew,可以安裝/更新/刪除Windows軟件。安裝chocolatey后,直接在Cmd或Powers界面執(zhí)行以下命令即可安裝curl,也比較方便:chocochocoinstallcurlcurl-iHTTP/1.1HTTP/1.1200Date:Wed,1Jan202013:36:32Content-Length:Content-Type:text/html;charset=utf-<head><title>Go<body><h1>直接使用Write方法注意,我們沒有設置內容類型,但是返回的首部中有Content-Type:text/html;charset=utf-WriteHeader方法的名字帶有一點誤導性,它并不能用于設置響應首部。WriteHeader接收一個整行寫入,但是不能對響應的首部進行任何修改操作。如果用戶在調用Write方法之前沒有執(zhí)行過WriteHeader方法,那么程序默認會使用200作為響應的狀態(tài)碼。Implemented作為狀態(tài)碼。funcfuncwriteHeaderHandler(whttp.ResponseWriter,r*http.Request){fmt.Fprintln(w,"ThisAPInot}mux.HandleFunc("/writeheader",curlcurl-iHTTP/1.1HTTP/1.1501NotDate:Wed,1Jan202014:15:16Content-Length:Content-Type: in;charset=utf-ThisAPInot////typeHeaderfuncfuncheaderHandler(whttp.ResponseWriter,r{w.Header().Set("Location"," }curlcurl-iHTTP/1.1HTTP/1.1302FoundDate:Wed,1Jan202014:17:49Content-Length: }curlcurl-iHTTP/1.1HTTP/1.1200Content-Type:application/jsonDate:Wed,1Jan202014:31:03GMTContent-Length:xml(application/xml)/pdf(application/pdf)/png(image/png)間無法記錄狀態(tài)。服務?可以在響應中設置,客戶端保存這些。然后每次請求時都帶上這些,服務?就可以通過這些記錄狀態(tài),辨別用戶等。整個計算機行業(yè)的收入都建立在機制之上,領域更是如此。上面的說法雖然有些夸張,但是可見的重要性。我們知道是互聯(lián)網最常見的盈利方式。其中有一個很厲害的模式,叫做。最常見的就是,剛剛在上搜索了某個關鍵字,然后打開淘寶或京東后發(fā)現(xiàn)相關的商品已經被推薦到首頁或邊欄了。這是由于這些組成了,只要加入它們,就可以共戶瀏覽?的 Go 使用 結構表 //// struct{ RawExpiresstring }沒有設置Expires字段的 或臨時,這種 時就會自動刪除。設置了Expires字段的 HttpOnly字段設置為true時,該 Expires和MaxAge都可以用于設置 的過期時間。Expires字段設置的是 時間點過期,而MaxAge字段表示 自創(chuàng)建之后能夠存活多少秒。雖然HTTP1.1中廢棄了 funcfunc(whttp.ResponseWriter,r*http.Request)c1:={Name:}c2:={Name:} ", ",} ", 運行程序,打開瀏覽?輸入localhost:8080/set_,在瀏覽?開發(fā)者工具,切換到Application(應用),查看ooe。在左側s下點擊測試的URL,右側即可顯示我們剛剛設置的:上面構造的代碼中,有幾點需要注意:首部名稱為Set- 設置第一個調用Header類型的Set方法,添加第二個時調用Add方法。Set會將同名的鍵覆蓋掉。如果第二個也調用Set方法,那么第一個將會被覆funcfunc2(whttp.ResponseWriter,r{c1:= }c2c2:={Name:}(w,(w,} 2", 如果收到的響應中有信息,瀏覽?會將這些保存下來。只有沒有過期,在向同一個主機 。在服務端,我們可以從請求的Header字段屬性來獲得funcfunc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論