[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
小黑與程式的邂逅
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
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) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News