Files
build-web-application-with-…/zh-tw/03.2.md
2019-02-26 01:40:54 +08:00

69 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3.2 Go建立一個Web伺服器
前面小節已經介紹了Web是基於http協議的一個服務Go語言裡面提供了一個完善的net/http套件透過http套件可以很方便的建立起來一個可以執行的Web服務。同時使用這個套件能很簡單地對Web的路由靜態檔案模版cookie等資料進行設定和操作。
## http套件建立Web伺服器
```Go
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析引數,預設是不會解析的
fmt.Println(r.Form) //這些資訊是輸出到伺服器端的列印資訊
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") //這個寫入到w的是輸出到客戶端的
}
func main() {
http.HandleFunc("/", sayhelloName) //設定訪問的路由
err := http.ListenAndServe(":9090", nil) //設定監聽的埠
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
```
上面這個程式碼我們build之後然後執行web.exe,這個時候其實已經在9090埠監聽http連結請求了。
在瀏覽器輸入`http://localhost:9090`
可以看到瀏覽器頁面輸出了`Hello astaxie!`
可以換一個地址試試:`http://localhost:9090/?url_long=111&url_long=222`
看看瀏覽器輸出的是什麼,伺服器輸出的是什麼?
在伺服器端輸出的資訊如下:
![](images/3.2.goweb.png?raw=true)
圖3.8 使用者訪問Web之後伺服器端列印的資訊
我們看到上面的程式碼要編寫一個Web伺服器很簡單只要呼叫http套件的兩個函式就可以了。
>如果你以前是PHP程式設計師那你也許就會問我們的nginx、apache伺服器不需要嗎Go就是不需要這些因為他直接就監聽tcp埠了做了nginx做的事情然後sayhelloName這個其實就是我們寫的邏輯函數了跟php裡面的控制層controller函式類似。
>如果你以前是Python程式設計師那麼你一定聽說過tornado這個程式碼和他是不是很像沒錯Go就是擁有類似Python這樣動態語言的特性寫Web應用很方便。
>如果你以前是Ruby程式設計師會發現和ROR的/script/server啟動有點類似。
我們看到Go透過簡單的幾行程式碼就已經執行起來一個Web服務了而且這個Web服務內部有支援高併發的特性我將會在接下來的兩個小節裡面詳細的講解一下Go是如何實現Web高併發的。
## links
* [目錄](<preface.md>)
* 上一節: [Web工作方式](<03.1.md>)
* 下一節: [Go如何使得web工作](<03.3.md>)