網(wǎng)站開發(fā)人月薪網(wǎng)絡(luò)營銷方法有哪幾種
web工作流程
- Web服務(wù)器的工作原理可以簡單地歸納為
- 客戶機通過TCP/IP協(xié)議建立到服務(wù)器的TCP連接
- 客戶端向服務(wù)器發(fā)送HTTP協(xié)議請求包,請求服務(wù)器里的資源文檔
- 服務(wù)器向客戶機發(fā)送HTTP協(xié)議應(yīng)答包,如果請求的資源包含有動態(tài)語言的內(nèi)容,那么服務(wù)器會調(diào)用動態(tài)語言的解釋引擎負責(zé)處理“動態(tài)內(nèi)容”,并將處理得到的數(shù)據(jù)返回給客戶端
- 客戶機與服務(wù)器斷開。由客戶端解釋HTML文檔,在客戶端屏幕上渲染圖形結(jié)果
HTTP協(xié)議
-
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,它詳細規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議
-
HTTP協(xié)議通常承載于TCP協(xié)議之上
talk is cheap , show me the code
package mainimport ("fmt""io/ioutil""log""net/http"
)func main() {//http://127.0.0.1:8000/go// 單獨寫回調(diào)函數(shù)http.HandleFunc("/go", myHandler)// addr:監(jiān)聽的地址// handler:回調(diào)函數(shù)http.ListenAndServe("127.0.0.1:8000", nil)
}// handler函數(shù)
func myHandler(w http.ResponseWriter, r *http.Request) {fmt.Println(r.RemoteAddr, "連接成功")// 請求方式:GET POST DELETE PUT UPDATEfmt.Println("method:", r.Method)// /gofmt.Println("url:", r.URL.Path)fmt.Println("header:", r.Header)fmt.Println("body:", r.Body)// 回復(fù)switch r.Method {case "GET":{w.Write([]byte("get"))}case "POST":{// 讀取body內(nèi)容content, err := ioutil.ReadAll(r.Body)if err != nil {log.Println("read post body occurs error: ", err)}fmt.Println("post body:", string(content))w.Write([]byte("post"))}default:{w.Write([]byte(r.Method))}}fmt.Println("end---")
}
package mainimport ("encoding/json""fmt""io""log""net/http""strings"
)type Data struct {Name string `json:"name"`Age int8 `json:"age"`
}func main() {//resp, _ := http.Get("http://www.baidu.com")//fmt.Println(resp)resp, _ := http.Get("http://127.0.0.1:8000/go")ResponseHandler(resp)fmt.Println("----")data := &Data{Name: "hello",Age: 18,}// 轉(zhuǎn)換成json格式data_json, err := json.Marshal(data)if err != nil {log.Println("json.Marshaler error: ", err)}fmt.Println(string(data_json))resp, _ = http.Post("http://127.0.0.1:8000/go", "application/json", strings.NewReader(string(data_json)))ResponseHandler(resp)
}func ResponseHandler(resp *http.Response) {defer resp.Body.Close()// 200 OKfmt.Println(resp.Status)fmt.Println(resp.Header)buf := make([]byte, 1024)for {// 接收服務(wù)端信息n, err := resp.Body.Read(buf)if err != nil && err != io.EOF {fmt.Println(err)return} else {fmt.Println("讀取完畢")res := string(buf[:n])fmt.Println(res)break}}
}
結(jié)果
> go run .\server.go
127.0.0.1:54856 連接成功
method: GET
url: /go
header: map[Accept-Encoding:[gzip] User-Agent:[Go-http-client/1.1]]
body: {}
end---
127.0.0.1:54856 連接成功
method: POST
url: /go
header: map[Accept-Encoding:[gzip] Content-Length:[25] Content-Type:[application/json] User-Agent:[Go-http-client/1.1]]
body: &{0xc0000b6048 <nil> <nil> false true {0 0} false false false 0x475080}
post body: {"name":"hello","age":18}
end---
> go run .\client.go
200 OK
map[Content-Length:[3] Content-Type:[text/plain; charset=utf-8] Date:[Mon, 25 Apr 2022 17:17:31 GMT]]
讀取完畢
get
----
{"name":"hello","age":18}
200 OK
map[Content-Length:[4] Content-Type:[text/plain; charset=utf-8] Date:[Mon, 25 Apr 2022 17:17:31 GMT]]
讀取完畢
post
http handler
的格式模板
// HandleFunc registers the handler function for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {DefaultServeMux.HandleFunc(pattern, handler)
}