欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言Web編程實(shí)現(xiàn)Get和Post請求發(fā)送與解析的方法詳解

 更新時(shí)間:2017年06月08日 10:27:35   作者:typ2004  
這篇文章主要介紹了Go語言Web編程實(shí)現(xiàn)Get和Post請求發(fā)送與解析的方法,結(jié)合實(shí)例形式分析了Go語言客戶端、服務(wù)器端結(jié)合實(shí)現(xiàn)web數(shù)據(jù)get、post發(fā)送與接收數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Go語言Web編程實(shí)現(xiàn)Get和Post請求發(fā)送與解析的方法。分享給大家供大家參考,具體如下:

這是一篇入門文章,通過一個(gè)簡單的例子介紹Golang的Web編程主要用到的技術(shù)。

文章結(jié)構(gòu)包括:

1. Client-Get 請求
2. Client-Post 請求
3. Server 處理 Get 和 Post 數(shù)據(jù)

在數(shù)據(jù)的封裝中,我們部分采用了json,因而本文也涉及到Golang中json的編碼和解碼。

一、Client-Get

復(fù)制代碼 代碼如下:
package main
import (
        "fmt"
        "net/url"
        "net/http"
        "io/ioutil"
        "log"
)
func main() {
        u, _ := url.Parse("http://localhost:9001/xiaoyue")
        q := u.Query()
        q.Set("username", "user")
        q.Set("password", "passwd")
        u.RawQuery = q.Encode()
        res, err := http.Get(u.String());
        if err != nil {
              log.Fatal(err) return
        }
        result, err := ioutil.ReadAll(res.Body)
        res.Body.Close()
        if err != nil {
              log.Fatal(err) return
        }
        fmt.Printf("%s", result)
}

二、Client-Post

復(fù)制代碼 代碼如下:
package main
import (
        "fmt"
        "net/url"
        "net/http"
        "io/ioutil"
        "log"
        "bytes"
        "encoding/json"
)
type Server struct {
        ServerName string
        ServerIP   string
}
type Serverslice struct {
        Servers []Server
        ServersID  string
}
func main() {
        var s Serverslice
        var newServer Server;
        newServer.ServerName = "Guangzhou_VPN";
        newServer.ServerIP = "127.0.0.1"
        s.Servers = append(s.Servers, newServer)
        s.Servers = append(s.Servers, Server{ServerName: "Shanghai_VPN", ServerIP: "127.0.0.2"})
        s.Servers = append(s.Servers, Server{ServerName: "Beijing_VPN", ServerIP: "127.0.0.3"})
        s.ServersID = "team1"
        b, err := json.Marshal(s)
        if err != nil {
                fmt.Println("json err:", err)
        }
        body := bytes.NewBuffer([]byte(b))
        res,err := http.Post("http://localhost:9001/xiaoyue", "application/json;charset=utf-8", body)
        if err != nil {
                log.Fatal(err)
                return
        }
        result, err := ioutil.ReadAll(res.Body)
        res.Body.Close()
        if err != nil {
                log.Fatal(err)
                return
        }
        fmt.Printf("%s", result)
}

三、Server

復(fù)制代碼 代碼如下:
package main
import (
        "fmt"
        "net/http"
        "strings"
        "html"
        "io/ioutil"
        "encoding/json"
)
type Server struct {
        ServerName string
        ServerIP   string
}
type Serverslice struct {
        Servers []Server
        ServersID  string
}
func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":9001", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
        r.ParseForm() //解析參數(shù),默認(rèn)是不會解析的
        fmt.Fprintf(w, "Hi, I love you %s", html.EscapeString(r.URL.Path[1:]))
        if r.Method == "GET" {
                fmt.Println("method:", r.Method) //獲取請求的方法
                fmt.Println("username", r.Form["username"])
                fmt.Println("password", r.Form["password"])
                for k, v := range r.Form {
                        fmt.Print("key:", k, "; ")
                        fmt.Println("val:", strings.Join(v, ""))
                }
        } else if r.Method == "POST" {
                result, _:= ioutil.ReadAll(r.Body)
                r.Body.Close()
                fmt.Printf("%s\n", result)
                //未知類型的推薦處理方法
                var f interface{}
                json.Unmarshal(result, &f)
                m := f.(map[string]interface{})
                for k, v := range m {
                        switch vv := v.(type) {
                                case string:
                                        fmt.Println(k, "is string", vv)
                                case int:
                                        fmt.Println(k, "is int", vv)
                                case float64:
                                        fmt.Println(k,"is float64",vv)
                                case []interface{}:
                                        fmt.Println(k, "is an array:")
                                        for i, u := range vv {
                                                fmt.Println(i, u)
                                        }
                                default:
                                        fmt.Println(k, "is of a type I don't know how to handle")
                         }
                  }
                 //結(jié)構(gòu)已知,解析到結(jié)構(gòu)體
                 var s Serverslice;
                 json.Unmarshal([]byte(result), &s)
                 fmt.Println(s.ServersID);
                 for i:=0; i<len(s.Servers); i++ {
                         fmt.Println(s.Servers[i].ServerName)
                         fmt.Println(s.Servers[i].ServerIP)
                 }
        }
}

希望本文所述對大家Go語言程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 用Go寫一個(gè)輕量級的ssh批量操作工具的方法

    用Go寫一個(gè)輕量級的ssh批量操作工具的方法

    這篇文章主要介紹了用Go寫一個(gè)輕量級的ssh批量操作工具的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Go語言流程控制詳情

    Go語言流程控制詳情

    這篇文章主要介紹了Go語言流程控制詳情,流程控制包含分三大類:條件判斷,循環(huán)控制和無條件跳轉(zhuǎn)。下面關(guān)于更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • Go中如何使用set的方法示例

    Go中如何使用set的方法示例

    這篇文章主要介紹了Go中如何使用set的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)

    Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)

    社區(qū)不少人在談?wù)?nbsp;golang 為毛不用try/catch模式,而采用苛刻的recovery、panic、defer組合,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-07-07
  • 聊聊Golang中很好用的viper配置模塊

    聊聊Golang中很好用的viper配置模塊

    這篇文章主要介紹了Golang中很好用的viper配置模塊用法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全?

    Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全?

    這篇文章主要介紹了Go語言atomic.Value如何不加鎖保證數(shù)據(jù)線程安全詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Golang高效解析和生成XML的示例詳解

    Golang高效解析和生成XML的示例詳解

    這篇文章將從Golang中處理XML的基本概念開始,詳細(xì)介紹如何讀取和解析XML文件,然后轉(zhuǎn)向如何創(chuàng)建和輸出XML數(shù)據(jù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Golang壓縮Jpeg圖片和PNG圖片的操作

    Golang壓縮Jpeg圖片和PNG圖片的操作

    這篇文章主要介紹了Golang壓縮Jpeg圖片和PNG圖片的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 利用Go語言實(shí)現(xiàn)流量回放工具的示例代碼

    利用Go語言實(shí)現(xiàn)流量回放工具的示例代碼

    今天給大家推薦一款使用Go語言編寫的流量回放工具?--?goreplay;工作中你一定遇到過需要在服務(wù)器上抓包的場景,有了這個(gè)工具就可以助你一臂之力,廢話不多,我們接下來來看一看這個(gè)工具
    2022-09-09
  • Go中變量命名規(guī)則與實(shí)例

    Go中變量命名規(guī)則與實(shí)例

    命名規(guī)則涉及變量、常量、全局函數(shù)、結(jié)構(gòu)、接口、方法等的命名,下面這篇文章主要給大家介紹了關(guān)于Go中變量命名的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01

最新評論