Golang網(wǎng)絡(luò)請(qǐng)求

說(shuō)明

本文主要分為服務(wù)器和客戶(hù)端

服務(wù)器

服務(wù)器監(jiān)聽(tīng)http請(qǐng)求類(lèi)型主要常用到以下幾種方式:

  • 解析get的form表單
  • 解析post的方式解析json對(duì)象
  • 解析以表單的方式解析postform數(shù)據(jù)

解析get的form表單

func GetService(w http.ResponseWriter, r *http.Request)  {
    //解析get的form表單
    r.ParseForm()
    fmt.Println(r.Form["name"])
    fmt.Println(r.Form["sex"])
    fmt.Println(strings.Join(r.Form["name"], "-"))
    fmt.Println(strings.Join(r.Form["sex"], "-"))
    for k, v := range r.Form {
        fmt.Println(k, "=>", v, strings.Join(v, "-"))
    }
    //將數(shù)據(jù)回傳到客戶(hù)端
    fmt.Fprint(w, "It works")
}

解析post的方式解析json對(duì)象

func PostService(w http.ResponseWriter, r *http.Request){
    //讀取body
    body , err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println("read fail")
        return
    }
    //解析body成string
    bodyStr := string(body)
    fmt.Println("bodyStr", bodyStr)
    //反序列化,解析body到struct
    var user User
    err1 := json.Unmarshal(body, &user)
    if err1 != nil{
        fmt.Println("unmarshal fail")
        return
    }
    fmt.Println("user", user.Name, user.Sex)
    //返回?cái)?shù)據(jù)
    fmt.Fprint(w, "Post is works")
}

解析以表單的方式提交postform數(shù)據(jù)

func PostFormService(w http.ResponseWriter, r *http.Request) {
    //讀取body表單
    r.ParseForm()
    fmt.Println(r.Form["name"])
    fmt.Println(r.Form["sex"])
    fmt.Println(strings.Join(r.Form["name"], "-"))
    fmt.Println(strings.Join(r.Form["sex"], "-"))
    for k, v := range r.Form {
        fmt.Println(k, "=>", v, strings.Join(v, "-"))
    }
    //返回?cái)?shù)據(jù)
    fmt.Fprint(w, "Post is works")
}

服務(wù)端用到的結(jié)構(gòu)體

type User struct {
    Name string `json:"name"`
    Sex string `json:"sex"`
}

開(kāi)啟服務(wù)器的方法:

http.HandleFunc("/get", GetService)
http.HandleFunc("/post", PostService)
http.HandleFunc("/postform", PostFormService)
//監(jiān)聽(tīng)端口號(hào)
if err := http.ListenAndServe("127.0.0.1:8888", nil); err != nil {
    fmt.Println("service start err")
}

客戶(hù)端

對(duì)應(yīng)的客戶(hù)端請(qǐng)求方式有:

  • 發(fā)起Get請(qǐng)求
  • 發(fā)起Post請(qǐng)求
  • 發(fā)起PostForm請(qǐng)求

發(fā)起Get請(qǐng)求

func GetTest()  {
    //構(gòu)造url
    u, err := url.Parse("http://localhost:8888/get?")
    if err != nil {
        fmt.Println("url parse fail")
        return
    }
    q := u.Query()
    q.Set("name", "wnw")
    q.Set("sex", "wowam")
    u.RawQuery = q.Encode()
    //發(fā)起get請(qǐng)求
    resp, err1 := http.Get(u.String())
    if err1 != nil || resp.StatusCode != http.StatusOK{
        fmt.Println("get fail:", err1)
        return
    }
    defer resp.Body.Close()
    //讀取響應(yīng)體
    body, err2 := ioutil.ReadAll(resp.Body)
    if err2 != nil {
        fmt.Println("read body fail")
        return
    }
    fmt.Println(string(body))
    //解析數(shù)據(jù)
}

發(fā)起Post請(qǐng)求

func PostTest()  {
    u := "http://localhost:8888/post?"
    user := MyUser{"小小王","女"}
    //序列化對(duì)象
    body, err := json.Marshal(user)
    if err != nil {
        fmt.Println("marshal fail")
        return
    }
    resp, err1 := http.Post(u, "application/x-www-form-urlencoded", strings.NewReader(string(body)))
    if err1 != nil {
        fmt.Println("post fail")
        return
    }
    //解析響應(yīng)的數(shù)據(jù)
    defer resp.Body.Close()
    b, err2 := ioutil.ReadAll(resp.Body)
    if err2 != nil {
        fmt.Println("read body fail")
        return
    }
    fmt.Println(string(b))
}

發(fā)起PostForm請(qǐng)求

func PostFormTest()  {
    //構(gòu)造參數(shù)
    u, err := url.Parse("http://localhost:8888/postform?")
    if err != nil {
        fmt.Println("parse is fail")
        return
    }
    q := u.Query()
    q.Set("name", "大大王")
    q.Set("sex", "男")
    //發(fā)起post表單請(qǐng)求
    resp, err1 := http.PostForm(u.String(), q)
    if err1 != nil {
        fmt.Println("post fail")
        return
    }
    //解析響應(yīng)
    defer resp.Body.Close()
    body, err2 := ioutil.ReadAll(resp.Body)
    if err2 != nil{
        fmt.Println("body fail")
        return
    }
    fmt.Println(string(body))
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評(píng)論 19 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,692評(píng)論 4 61
  • 初中二年級(jí)的時(shí)候才開(kāi)始看郭敬明,那時(shí)候每天頂著被老師發(fā)現(xiàn)的危險(xiǎn)放在書(shū)下面看,喜歡溫暖明亮的立夏;高冷而又溫暖...
    茹也呀閱讀 247評(píng)論 0 0
  • 由于最近身體原因,無(wú)法安靜寫(xiě)點(diǎn)東西,簡(jiǎn)書(shū)就放下了這么久。從今天重新開(kāi)始撿起。 先講講昨天一天老公的經(jīng)歷吧。 ...
    柳立穩(wěn)閱讀 193評(píng)論 0 0
  • 看到和聽(tīng)到的,經(jīng)常會(huì)令你們沮喪,世俗是這樣強(qiáng)大,強(qiáng)大到生不出改變它們的念頭來(lái)??墒侨绻袡C(jī)會(huì)提前了解了你們的人生...
    stillwater_63d6閱讀 134評(píng)論 0 0

友情鏈接更多精彩內(nèi)容