GO http
阿新 • • 發佈:2018-11-28
go 語言的http 包可以很方便的構建一個簡單的http server
下面我們通過程式碼來熟悉go 的http 包
package growth
import (
"net/http"
"log"
"fmt"
)
// golang 第九天 學習 go web 程式設計
// 簡單的go web server 可以通過net/http 包來實現
func Day09WebDemo() {
// 設定路由
http.HandleFunc("/", helloWorldPage)
// http server 監聽埠
err := http.ListenAndServe (":9000", nil)
if err != nil {
log.Fatal(err)
}
}
func helloWorldPage(w http.ResponseWriter, r *http.Request) {
r.ParseForm() // 解析表單
fmt.Println("請求的url", r.URL.Path)
fmt.Println("請求的表單", r.Form)
fmt.Println("請求的方法", r.Method)
fmt.Println("請求地址", r.Host)
fmt.Println ("客戶端地址", r.RemoteAddr)
for k, v := range r.Form{
fmt.Println(k)
fmt.Println(v)
}
fmt.Fprint(w, "Hello World")
}
上面的例子使用http.HandleFunc(), 指定了url 地址和 url 繫結的函式,使用http.ListenAndServe 指定了監聽的埠, 我們將請求到 / 這個地址的繫結到了函式 helloWorldPage(), 需要注意的是,使用HandleFunc 繫結到的函式 必須要接收兩個引數 http.ResponseWriter 和 http.Request, 我們通過 第二個引數 http.Request 就可以獲取到各種請求的資訊, 通過 http.ResponseWriter 給客戶端響應
http處理表單資料
通過前面的例子我們知道了通過http.Request 可以獲取到各種請求的資訊,那當然也可以獲取到使用者POST的資料, 下面我們通過程式碼來學習獲取表單的資料
func Day10WebForm() {
log.Println("Day10WebForm start")
// 將 /login 請求交給login 函式處理
http.HandleFunc("/login", login)
err := http.ListenAndServe(":8181", nil)
if err != nil {
fmt.Println("Startup Error, ", err)
}
}
// login ==================================================================
func login(w http.ResponseWriter, r *http.Request) {
r.ParseForm() // 不執行這個 ParseForm 無法獲取到表單資料
fmt.Println("Web Form: ", r.Form)
// method := r.Method
if len(r.Form) == 0 {
log.Println("Form Cannot Be Empty")
}
username := r.FormValue("username")
passwd := r.FormValue("password")
if username != "beer" {
fmt.Fprintln(w, "username Error")
}
if passwd != "123456" {
fmt.Fprintln(w, "password Error")
}
log.Println("login success!")
fmt.Fprintln(w, "200 OK")
}
這裡我們通過FormValue的方法拿到表單的資料
http 處理檔案上傳
處理檔案上傳的思路就是拿到使用者上傳的檔案,這裡不再使用FormValue了 而是使用FormFile的方法,然後拿到檔案的元資料,再寫入檔案即可
下面是檔案上傳的服務端demo 和 客戶端的html 程式碼
服務端處理檔案程式碼
package growth
import (
"net/http"
"fmt"
"os"
"io"
)
// golang 第十一天 學習 go web 程式設計 處理檔案上傳
func UploadHandler(w http.ResponseWriter, r *http.Request) {
// 處理檔案上傳
method := r.Method
if method == "POST" {
/*
處理檔案上傳我們需要呼叫r.ParseMultipartForm,裡面的引數表示maxMemory,呼叫ParseMultipartForm之後,
上傳的檔案儲存在maxMemory大小的記憶體裡面,如果檔案大小超過了maxMemory,那麼剩下的部分將儲存在系統的臨時檔案中。
我們可以通過r.FormFile獲取上面的檔案控制代碼
*/
r.ParseMultipartForm(4096)
file, handler, err := r.FormFile("upload")
if err != nil {
fmt.Println("FormFile Error", err)
}
fmt.Println("正在上傳", handler.Filename)
defer file.Close()
// 服務端開啟一個檔案 以便將客戶端上傳的檔案寫入到該檔案
fd, e := os.OpenFile("./" + handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if e != nil {
fmt.Println("Write File Error")
}
// 寫入檔案
io.Copy(fd, file)
defer fd.Close()
fmt.Fprintln(w, "200 OK Upload success! ", handler.Filename)
}
}
func Day11WebUploadFile() {
http.HandleFunc("/upload", UploadHandler)
err := http.ListenAndServe(":8182", nil)
if err != nil {
fmt.Println("檔案上傳失敗", err)
}
}
客戶端html 上傳檔案
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上傳</title>
</head>
<body>
<form enctype="multipart/form-data" action="http://127.0.0.1:8182/upload" method="post">
<input type="file" name="upload" />
<input type="submit" value="上傳" />
</form>
</body>
</html>