[Go]處理請求

閱讀時間約 13 分鐘

Request內容

package main

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

func request(w http.ResponseWriter, r *http.Request) {
//這些資訊是輸出到伺服器端的列印訊息
fmt.Println("Request解析")
//HTTP方法
fmt.Println("method", r.Method)
//RequestURI是被客戶端傳送到服務端的請求的請求行中未修改的請求URI
fmt.Println("RequestURI:", r.RequestURI)
//URL類型,下方分別列出URL的各成員
fmt.Println("URL_path", r.URL.Path)
fmt.Println("URL_RawQuery", r.URL.RawQuery)
fmt.Println("URL_Fragment", r.URL.Fragment)
//協定版本
fmt.Println("proto", r.Proto)
fmt.Println("protomajor", r.ProtoMajor)
fmt.Println("protominor", r.ProtoMinor)
//HTTP請求的頭域
for k, v := range r.Header {
for _, vv := range v {
fmt.Println("header key:" + k + " value:" + vv)
}
}
//判斷是否multipart方式
isMultipart := false
for _, v := range r.Header["Content-Type"] {
if strings.Index(v, "multipart/form-data") != -1 {
isMultipart = true
}
}
//解析body
if isMultipart == true {
r.ParseMultipartForm(128)
fmt.Println("解析方式:ParseMultipartForm")
} else {
r.ParseForm()
fmt.Println("解析方式:ParseForm")
}
//body內容長度
fmt.Println("ContentLength", r.ContentLength)
//是否在回覆請求後關閉連接
fmt.Println("Close", r.Close)
//HOSt
fmt.Println("host", r.Host)
//該請求的來源位址
fmt.Println("RemoteAddr", r.RemoteAddr)

fmt.Fprintf(w, "hello, let's go!")
//這個寫入到w的是輸出到客戶端的
}
func main() {
http.HandleFunc("/hello", request)
err := http.ListenAndServe(":8081", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}


URL內容

package main

import "net/url"

func main() {
path := "http://lcoalhost:8082/article?id=1"
p, _ := url.Parse(path) // 解析url
println(p.Host)//lcoalhost:8082
println(p.User)//0x0
println(p.RawQuery)//id=1
println(p.RequestURI())///article?id=1
}


請求的內容

package main

import (
"fmt"
"net/http"
)

func getBody(w http.ResponseWriter, r *http.Request) {
//取得請求訊息的內容長度
len := r.ContentLength
//新建一個位元組切片,長度與請求封包的內容長度相同
body := make([]byte, len)
//讀取r的請求主體,並將具體內容讀入body中
r.Body.Read(body)
//將位元組切片內容寫入對應報文
fmt.Fprintln(w, string(body))
}
func main() {
http.HandleFunc("/getBody", getBody)
err := http.ListenAndServe(":8082", nil)
if err != nil {
fmt.Println(err)
}
}


Form與PostForm

package main

import (
"fmt"
"html/template"
"io/ioutil"
"net/http"
)

func process(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, _ := template.ParseFiles("form.html")
t.Execute(w, nil)
} else {
r.ParseForm()//語法分析
fmt.Fprintln(w, "表單鍵值對和URL鍵值對:", r.Form)
fmt.Fprintln(w, "表單鍵值對:", r.PostForm)
}
}

func main() {
http.HandleFunc("/", process)
http.ListenAndServe(":8089", nil)
}


MultipartForm

package main

import (
"fmt"
"html/template"
"io/ioutil"
"net/http"
)

func multiProcess(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, _ := template.ParseFiles("form.html")
t.Execute(w, nil)
} else {
r.ParseMultipartForm(1024)//從表單中提取多少位元組的數據
fmt.Fprintln(w,"表单键值对:", r.MultipartForm)
}
}

func main() {
http.HandleFunc("/", multiProcess)
http.ListenAndServe(":8089", nil)
}


上傳檔案

package main

import (
"fmt"
"html/template"
"io/ioutil"
"net/http"
)

//上傳
func upload(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, _ := template.ParseFiles("upload.html")
t.Execute(w, nil)
} else {
r.ParseMultipartForm(4096)
fileHeader := r.MultipartForm.File["uploaded"][0]//取得名為"uploaded"的第一個檔案頭

file, err := fileHeader.Open()//取得文件
if err != nil {
fmt.Println("error")
return
}
data, err := ioutil.ReadAll(file)//讀取文件
if err != nil {
fmt.Println("error!")
return
}
fmt.Fprintln(w, string(data))
}
}

func main() {
http.HandleFunc("/", upload)
http.ListenAndServe(":8089", nil)
}


WriteHeader()與Header()

package main

import (
"fmt"
"net/http"
)

func Redirect(w http.ResponseWriter, r *http.Request) {
//設定一個301重定向
w.Header().Set("Location", "https://www.xxx.com")
w.WriteHeader(301)
}

func main() {
http.HandleFunc("/redirect", Redirect)
err := http.ListenAndServe(":8086", nil)
if err != nil {
fmt.Println(err)
}
}

這邊要注意w.Header().Set()與w.WriteHeader()的使用順序。


Write()

字串

package main

import (
"fmt"
"net/http"
)

func Welcome(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Go go!"))
}

func main() {
http.HandleFunc("/welcome", Welcome)
err := http.ListenAndServe(":8086", nil)
if err != nil {
fmt.Println(err)
}
}


HTML

package main

import (
"fmt"
"net/http"
)

func Home(w http.ResponseWriter, r *http.Request) {
html := `<html>
<head>
<title>Write()內容為HTML</title>
</head>
<body>
<h1>Go go go
</body>
</html>`
w.Write([]byte(html))
}

func main() {
http.HandleFunc("/", Home)
err := http.ListenAndServe(":8086", nil)
if err != nil {
fmt.Println(err)
}
}


JSON

package main

import (
"encoding/json"
"fmt"
"net/http"
)

type JsonData struct {
Message string `json:"message"`
}
func Hello(w http.ResponseWriter, r *http.Request) {
//返回JSON格式
jsonData := JsonData{
"Go go",
}
message, _ := json.Marshal(jsonData)
w.Header().Set("Content-Type", "application/json")
w.Write(message)
}

func main() {
http.HandleFunc("/", Hello)
err := http.ListenAndServe(":8086", nil)
if err != nil {
fmt.Println(err)
}
}





avatar-img
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
ServeMux ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。 DefaultServeMux DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
ServeMux ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。 DefaultServeMux DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
你可能也想看
Google News 追蹤
Thumbnail
Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
👨‍💻 簡介 一開始介紹基本資料型別時有稍微提到一點string的處理,今天介紹string的一些操作,像是檢查的功能、修改的功能、比較的功能等等。
Thumbnail
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
Thumbnail
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
Thumbnail
👨‍💻簡介 在軟體開發中,錯誤無所不在。無論是網路請求失敗、檔案不存在,還是數學計算錯誤,處理錯誤是任何開發者的日常工作,系統的穩定度基本取決於對於錯誤處理是否全面,好的錯誤處理也可以產生適當的錯誤訊息,讓 Debug 更加容易。
Thumbnail
  各位爸媽們,在疫情持續且停課時間延長的日子裡,大家都還好嗎?想先跟各位說聲:辛苦了。當孩子們在家學習、遊戲,手足間的相處時光變長,有沒有覺得互相計較、一言不合就衝突的情形變多了呢?以下有幾點衝突處理的原則,供各位爸媽參考
Thumbnail
當一顆種子天天被陽光露水,折磨在潮濕悶熱的土壤裡時,你我不會感到惋惜,因為曉得這是刺激生命更燦爛的關鍵,但倘若你我就是那顆種子,就是正被困住、被壓迫在毫無自由的階段裡,還能相信自己的未來很燦爛嗎? 圖片摘自臉書「家政夫的悄悄話」。 最近因著寒假的緣故,家政夫有機會坐在書桌前,一邊調整三条老師的錄音內
Thumbnail
一直以來不敢踏入吃素的行列,雖然知道吃素對世界好處多多,但總覺得身體會處在長期慢性缺乏蛋白質的狀態。但事實上,我才執行兩週,好處之明顯,讓我非常興奮,不得不打在這裡跟大家分享。
Thumbnail
完整標題:go on 與「繼往走向」或「繼往開來」及「繼」、「續」、「繼續」、「接續」、「启開」、「正昂」、「發生」等的轉換密碼
Thumbnail
完整標題:go 與「之」、「至」、「至于」、「到」、「到于」、「前往」、「進往」、「步往」、「走」、「走于」、「走往」、「行」、「行于」、「行往」、「行走」、「去」、「過」、「過去」、「過于」、「步」、「步于」、「步往」、「步行」、「機遇」、「行旺」等的轉換密碼
Thumbnail
完整標題:go around 與「逛」、「觀覽」、「交往」、「相處」、「走訪」、「轉繞圓動」等的轉換密碼及「天狼星」之謎
Thumbnail
Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
👨‍💻 簡介 一開始介紹基本資料型別時有稍微提到一點string的處理,今天介紹string的一些操作,像是檢查的功能、修改的功能、比較的功能等等。
Thumbnail
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
Thumbnail
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
Thumbnail
👨‍💻簡介 在軟體開發中,錯誤無所不在。無論是網路請求失敗、檔案不存在,還是數學計算錯誤,處理錯誤是任何開發者的日常工作,系統的穩定度基本取決於對於錯誤處理是否全面,好的錯誤處理也可以產生適當的錯誤訊息,讓 Debug 更加容易。
Thumbnail
  各位爸媽們,在疫情持續且停課時間延長的日子裡,大家都還好嗎?想先跟各位說聲:辛苦了。當孩子們在家學習、遊戲,手足間的相處時光變長,有沒有覺得互相計較、一言不合就衝突的情形變多了呢?以下有幾點衝突處理的原則,供各位爸媽參考
Thumbnail
當一顆種子天天被陽光露水,折磨在潮濕悶熱的土壤裡時,你我不會感到惋惜,因為曉得這是刺激生命更燦爛的關鍵,但倘若你我就是那顆種子,就是正被困住、被壓迫在毫無自由的階段裡,還能相信自己的未來很燦爛嗎? 圖片摘自臉書「家政夫的悄悄話」。 最近因著寒假的緣故,家政夫有機會坐在書桌前,一邊調整三条老師的錄音內
Thumbnail
一直以來不敢踏入吃素的行列,雖然知道吃素對世界好處多多,但總覺得身體會處在長期慢性缺乏蛋白質的狀態。但事實上,我才執行兩週,好處之明顯,讓我非常興奮,不得不打在這裡跟大家分享。
Thumbnail
完整標題:go on 與「繼往走向」或「繼往開來」及「繼」、「續」、「繼續」、「接續」、「启開」、「正昂」、「發生」等的轉換密碼
Thumbnail
完整標題:go 與「之」、「至」、「至于」、「到」、「到于」、「前往」、「進往」、「步往」、「走」、「走于」、「走往」、「行」、「行于」、「行往」、「行走」、「去」、「過」、「過去」、「過于」、「步」、「步于」、「步往」、「步行」、「機遇」、「行旺」等的轉換密碼
Thumbnail
完整標題:go around 與「逛」、「觀覽」、「交往」、「相處」、「走訪」、「轉繞圓動」等的轉換密碼及「天狼星」之謎