[Go]處理請求

小黑-avatar-img
發佈於後端
更新 發佈閱讀 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
留言分享你的想法!
avatar-img
小黑與程式的邂逅
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
2024/06/05
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
2024/06/05
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
2024/06/04
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
2024/06/04
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
2024/06/03
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
Thumbnail
2024/06/03
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
Thumbnail
看更多
你可能也想看
Thumbnail
蝦皮分潤計畫讓我在分享旅遊文章時,也能透過推薦好物累積被動收入,貼補旅行基金。這篇文章,除了介紹計畫的操作亮點與心得,也分享我最常應用的案例:「旅行必備小物 TOP5」,包含行李鎖、免洗內衣褲、分裝瓶、折疊衣架與真空壓縮袋,幫助出國打包更輕鬆。想同時記錄旅行、分享好物又創造額外收入的你,千萬別錯過!
Thumbnail
蝦皮分潤計畫讓我在分享旅遊文章時,也能透過推薦好物累積被動收入,貼補旅行基金。這篇文章,除了介紹計畫的操作亮點與心得,也分享我最常應用的案例:「旅行必備小物 TOP5」,包含行李鎖、免洗內衣褲、分裝瓶、折疊衣架與真空壓縮袋,幫助出國打包更輕鬆。想同時記錄旅行、分享好物又創造額外收入的你,千萬別錯過!
Thumbnail
想增加被動收入?加入蝦皮分潤計畫是輕鬆上手的好方法!本文提供完整教學,包含申請流程、賺取分潤技巧,以及實際使用心得分享,助你輕鬆獲得額外收入。
Thumbnail
想增加被動收入?加入蝦皮分潤計畫是輕鬆上手的好方法!本文提供完整教學,包含申請流程、賺取分潤技巧,以及實際使用心得分享,助你輕鬆獲得額外收入。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News