成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 Go 創建一個 Web 應用

開發 前端
如果你看到上面的結果,你已經成功地創建了你的第一個 Golang 網絡和文件服務器。恭喜!如果您想進一步探索 Golang Web 服務器,Golang HTTP 包文檔中有很多很好的例子。

客戶端/服務器

假設你開發了一個使用 Go 語言編寫的程序來管理你的照片庫,這個程序可以在你的電腦上處理你的照片。你可能想與其他家庭成員分享這些照片,為此,你可以通過電子郵件發送包含所有照片的附件。但如果你拍了一萬張照片,這種解決方案可能是不可行的。

您可以將內容自動上傳到您最喜愛的社交網絡。如果您必須一次處理一張照片,該操作可能會變得非常耗時。另一種解決方案可能是將您的程序直接插入社交網絡系統,以編程方式上傳圖片。

我們可以借助社交網絡公開的 API 來做到這一點。您可以通過直接調用它們的 API 將圖片推送到 for 循環中。

在這種情況下,您將使用一個 API。你是客戶端。社交網絡代表服務器。

調用 API 意味著按照精確的文檔向 Web 服務器發出 HTTP(s) 請求。客戶端和服務器這兩個術語很重要,您必須記住它們。作為客戶端,我們使用(或消費)API。服務器是一個計算機程序,旨在接受和響應客戶端的 API 調用。

圖片

Go 語言在創建簡單高效的 Web 服務器方面很有優勢。Go 語言提供了內置的 HTTP 包,其中包含了快速創建 Web 或文件服務器所需的實用工具。這使得使用 Go 語言創建 Web 服務器和 Web 服務變得簡單和高效。

創建 server.go 文件

在上一篇文章中,我們學習了 net/http 包中的 Request 和 Response ,所以這里我們可以直接使用:

package main

import (
 "fmt"
 "log"
 "net/http"
)

func main() {

  http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintf(w, "Hello!")
  })

 fmt.Printf("Starting server at port 8088\n")

 if err := http.ListenAndServe(":8088", nil); err != nil {
  log.Fatal(err)
 }
}

運行 go run server.go ,可以在終端上看到如下輸出:

Starting server at port 8088

在此階段,我們將創建一個實際在端口 8088 上提供服務并可以響應傳入 GET 請求的 Web 服務器。讓我們在端口 8088 啟動 Web 服務器。ListenAndServe() 方法由我們在第一步中導入的 http 數據包導出。此方法允許我們啟動 Web 服務器并指定端口以偵聽傳入請求。請注意,端口參數需要作為以冒號標點符號開頭的字符串傳遞。第二個參數接受一個處理程序來為 HTTP/2 配置服務器,將 nil 作為第二個參數傳遞。

我們將使用 HandleFunc() 函數將路由處理程序添加到 Web 服務器。第一個參數接受它需要監聽的路徑 /hello。在這里,您告訴服務器監聽對 http://localhost:8088/hello 的任何傳入請求。第二個參數接受一個函數,該函數包含正確響應請求的業務邏輯。

默認情況下,此函數接受 ResponseWriter 以發回響應,并接受 Request 對象以提供有關請求本身的更多信息。例如,您可以訪問有關已發送標頭的信息,這對于驗證請求很有用。

圖片

如您所見,處理程序發送了一個“Hello!”消息,因為我們將此響應傳遞給 ResponseWriter。

路由添加基本校驗

不用說,安全很重要。讓我們探索一些增強 Go Web 服務器安全性的基本策略。在我們這樣做之前,我們應該花點時間來提高代碼的可讀性。讓我們創建 helloHandler 函數,它包含與 /hello 請求相關的所有邏輯。

func helloHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/hello" {
        http.Error(w, "404 not found.", http.StatusNotFound)
        return
    }

    if r.Method != "GET" {
        http.Error(w, "Method is not supported.", http.StatusNotFound)
        return
    }


    fmt.Fprintf(w, "Hello!")
}

此處理程序使用 Request 對象檢查請求的路徑是否正確。這是一個非常基本的示例,說明如何使用 Request 對象。

如果路徑不正確,服務器將向用戶返回 StatusNotFound 錯誤。要向用戶寫入錯誤,您可以使用 http.Error 方法。請注意,StatusNotFound 代碼對應于 404 錯誤。所有狀態代碼都可以在 Golang 文檔中找到。

接下來,我們添加一個檢查來驗證請求的類型。如果該方法不對應于 GET,則服務器返回一個新錯誤。當兩個檢查都通過時,服務器返回其成功響應“Hello!”。

我們需要做的最后一件事是修改 main() 函數中的 handleFunc 函數以接受上面的 helloHandler 函數。

http.HandleFunc("/hello", helloHandler)

完整的 server.go 文件如下:

package main

import (
 "fmt"
 "log"
 "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
 if r.URL.Path != "/hello" {
  http.Error(w, "404 not found", http.StatusNotFound)
  return
 }

 if r.Method != "GET" {
  http.Error(w, "Method is not supported", http.StatusNotFound)
  return
 }

 fmt.Fprintf(w, "Hello!")
}

func main() {

 http.HandleFunc("/hello", helloHandler)

 fmt.Printf("Starting server at port 8088\n")

 if err := http.ListenAndServe(":8088", nil); err != nil {
  log.Fatal(err)
 }
}

接下來,我們將使用 go run server.go 啟動 Go Web 服務器。您可以使用 Postman 或 cURL 等工具向 http://localhost:8088/hello 發送 POST 請求來測試您的安全性。我們將得到與上一次相同的結果。

啟動靜態 Web 服務器

在這一步中,我們將創建一個簡單的文件服務器來托管靜態文件。這將是對 Web 服務器的一個非常簡單的添加。為確保我們有內容可在 Web 服務器上提供服務,讓我們新建一個位于 static 文件夾中的 index.html 文件。為了簡單起見,只需在文件中添加一個標題為“Go Server”的標題。如果您愿意,可以添加更多文件或樣式文件以使您的 Web 服務器看起來更漂亮一些。

新建一個 index.html 文件:

<html>
  <head>
    <title>Learn Go</title>
  </head>
  <body>
    <h2>Go Server</h2>
  </body>
</html>

要為 static 文件夾提供服務,您必須向 server.go 添加兩行代碼。第一行代碼使用 FileServer 函數創建文件服務器對象。此函數接受 http.Dir 類型的路徑。因此,我們必須將字符串路徑“./static”轉換為 http.Dir 路徑類型。

不要忘記指定 Handle 路由,它接受路徑和文件服務器。此函數的作用與 HandleFunc 函數相同,但有一些細微差別。有關 FileServer 對象的更多信息,請查看文檔。

func main() {
    fileServer := http.FileServer(http.Dir("./static")) 
    http.Handle("/", fileServer)
    http.HandleFunc("/hello", helloHandler)


    fmt.Printf("Starting server at port 8088\n")
    if err := http.ListenAndServe(":8088", nil); err != nil {
        log.Fatal(err)
    }
}

是時候嘗試代碼了。使用 go run server.go 啟動服務器并訪問 http://localhost:8088/。你應該看到:

圖片

接受表單提交 POST 請求

最后,Web 服務器必須響應表單提交。讓我們向 static 文件夾中的 form.html 文件添加一些內容。請注意,表單操作已發送到 /form。這意味著來自表單的 POST 請求將被發送到 http://localhost:8088/form。表單本身要求輸入兩個變量:name 和 address。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <div>
      <form method="POST" actinotallow="/form">
        <label>Name</label><input name="name" type="text" value="" />
        <label>Address</label><input name="address" type="text" value="" />
        <input type="submit" value="submit" />
      </form>
    </div>
  </body>
</html>

下一步是創建處理程序來接受 /form 請求。 form.html 文件已經通過 FileServer 提供,可以通過 http://localhost:8088/form.html 訪問。

首先,該函數必須調用 ParseForm() 來解析原始查詢并更新 r.PostForm 和 r.Form。這將允許我們通過 r.FormValue 方法訪問 name 和 address 值。

在函數的末尾,我們使用 fmt.Fprintf 將這兩個值寫入 ResponseWriter。

func formHandler(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        fmt.Fprintf(w, "ParseForm() err: %v", err)
        return
    }
    fmt.Fprintf(w, "POST request successful")
    name := r.FormValue("name")
    address := r.FormValue("address")

    fmt.Fprintf(w, "Name = %s\n", name)
    fmt.Fprintf(w, "Address = %s\n", address)
}

不要忘記將新的表單處理程序路由添加到 main() 函數。

http.HandleFunc("/form", formHandler)

最后的 server.go 文件如下:

package main

import (
 "fmt"
 "log"
 "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
 if r.URL.Path != "/hello" {
  http.Error(w, "404 not found", http.StatusNotFound)
  return
 }

 if r.Method != "GET" {
  http.Error(w, "Method is not supported", http.StatusNotFound)
  return
 }

 fmt.Fprintf(w, "Hello!")
}

func formHandler(w http.ResponseWriter, r *http.Request) {
 if err := r.ParseForm(); err != nil {
  fmt.Fprintf(w, "ParseForm() err: %v", err)
  return
 }
 fmt.Fprintf(w, "POST request successful\n")
 name := r.FormValue("name")
 address := r.FormValue("address")

 fmt.Fprintf(w, "Name = %s\n", name)
 fmt.Fprintf(w, "Address = %s\n", address)
}

func main() {

 // http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
 //  fmt.Fprintf(w, "Hello!")
 // })

 fileServer := http.FileServer(http.Dir("./static"))
 http.Handle("/", fileServer)
 http.HandleFunc("/hello", helloHandler)

 http.HandleFunc("/form", formHandler)

 fmt.Printf("Starting server at port 8088\n")

 if err := http.ListenAndServe(":8088", nil); err != nil {
  log.Fatal(err)
 }
}

表單處理程序測試

我們可以通過使用 go run server.go 啟動服務器來測試表單。當服務器啟動時,訪問 http://localhost:8088/form.html。您應該看到兩個輸入字段和一個提交按鈕。

圖片

填寫完表格后,點擊提交按鈕。服務器應處理您的 POST 請求并在 http://localhost:8088/form 響應頁面上向您顯示結果,例如以下響應:

圖片

如果你看到上面的結果,你已經成功地創建了你的第一個 Golang 網絡和文件服務器。恭喜!如果您想進一步探索 Golang Web 服務器,Golang HTTP 包文檔中有很多很好的例子。

官方文檔:Writing Web Applications

責任編輯:武曉燕 來源: 宇宙之一粟
相關推薦

2014-10-15 11:01:02

Web應用測試應用

2014-04-14 15:54:00

print()Web服務器

2011-05-11 10:58:39

iOS

2019-07-05 08:39:39

GoSQL解析器

2009-01-19 11:07:42

C#Web.NET

2022-06-07 07:21:19

Python內置庫命令行

2017-06-08 15:53:38

PythonWeb框架

2022-09-19 08:07:28

Goweb 程序

2019-05-08 14:37:49

Web服務器HTTP

2021-04-15 08:55:51

Go struc代碼

2021-04-25 08:58:00

Go拍照云盤

2021-11-10 09:10:46

JS 錄屏功能JavaScript

2024-01-02 00:18:56

Buffalo項目Go Web框架

2010-08-13 13:05:30

Flex應用程序

2022-04-01 15:18:42

Web 框架網絡通信

2020-12-08 08:46:07

GoJava工具

2014-11-25 14:04:59

DockerDocker Nodeweb應用部署

2014-05-26 09:13:46

DockerPython

2009-10-19 14:14:19

OSGi Web應用

2009-11-28 20:08:20

谷歌ChromeWeb應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美不卡在线 | 艹逼网 | 亚洲视频免费 | 久草热视频 | 91福利在线观看视频 | 婷婷狠狠| 亚洲欧美激情精品一区二区 | 免费黄色片在线观看 | 亚洲免费在线观看av | 欧美又大粗又爽又黄大片视频 | 亚洲三级av | 久久久久久女 | 久久伊人在| 无人区国产成人久久三区 | 九九伦理片 | 黄色在线观看网站 | 亚洲精品欧美精品 | 亚洲一级毛片 | 丁香一区二区 | 国产高清久久 | 免费精品| 中文天堂网 | 国产性生活一级片 | 91pao对白在线播放 | 婷婷毛片| 日日噜噜噜夜夜爽爽狠狠视频97 | 日韩一区二区三区av | 二区三区在线观看 | 日韩中文字幕在线观看 | 视频羞羞| 国产欧美一区二区三区日本久久久 | 91色视频在线观看 | 99精品国产一区二区三区 | 在线亚洲免费视频 | 成人免费一区二区三区视频网站 | 在线国产欧美 | 欧美中文字幕一区 | 日本天天操 | 亚洲精品免费在线观看 | 激情五月婷婷在线 | 婷婷开心激情综合五月天 |