どのようにGoでフォーム要求を送信しますか?

3614 ワード

通常は第三者と相互作用して使うのはjsonですが、フォーム方式を使ってデータを提出することが要求されることもありますので、今日はGoでフォーム要求を送信する方法を学びます.
準備工作
まず、POST要求を受信し、受信したフィールド情報を返すテストコードがあります.
package main

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

func urlencodedHandler(w http.ResponseWriter, r *http.Request) {
    err := r.ParseForm()
    if err != nil {
        log.Printf("r.ParseForm(): %v", err)
        return
    }

    result := ""
    for k, v := range r.Form {
        result += fmt.Sprintf("%s:%v
", k, v) } fmt.Fprintf(w, result) } func multipartHandler(w http.ResponseWriter, r *http.Request) { err := r.ParseMultipartForm(4 * 1024 * 1024) if err != nil { log.Printf("r.ParseForm(): %v", err) return } result := "" for k, v := range r.MultipartForm.Value { result += fmt.Sprintf("%s:%v
", k, v) } for k, v := range r.MultipartForm.File { result += fmt.Sprintf("%s:%v
", k, v) } fmt.Fprintf(w, result) } func main() { http.HandleFunc("/urlencoded", urlencodedHandler) http.HandleFunc("/multipart", multipartHandler) log.Fatal(http.ListenAndServe(":8080", nil)) }
urlencoded要求を送信します.
urlencodedは主に純粋なテキスト要求に使われます.コードは以下の通りです.
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
)

func main() {
    payload := url.Values{}
    payload.Set("foo", "a")
    payload.Add("foo", "b")
    payload.Set("foo2", "c")

    req, err := http.NewRequest(http.MethodPost,
                            "http://localhost:8080/urlencoded",
                            strings.NewReader(payload.Encode()))
    if err != nil {
        return
    }

    req.Header.Add("Content-Type",
                  "application/x-www-form-urlencoded; param=value")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return
    }

    defer resp.Body.Close()

    data, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(string(data))
}
go run urlencoded.go出力の結果は以下の通りです.
foo2:[c]
foo:[a b]
multipartリクエストを送ります.
multiiPadは主にファイルアップロードの要求を送るために使われます.コードは以下の通りです.
package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "mime/multipart"
    "net/http"
)

func main() {
    buf := new(bytes.Buffer)

    writer := multipart.NewWriter(buf)
    writer.WriteField("foo", "a")
    writer.WriteField("foo", "b")

    part, err := writer.CreateFormFile("tmp.png", "tmp.png")
    if err != nil {
        return
    }

    fileData := []byte("hello,world")  //                   
    part.Write(fileData)

    if err = writer.Close(); err != nil {
        return
    }

    req, err := http.NewRequest(http.MethodPost,
                              "http://localhost:8080/multipart",
                              buf)
    if err != nil {
        return
    }

    req.Header.Add("Content-Type", writer.FormDataContentType())

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return
    }

    defer resp.Body.Close()

    data, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(string(data))
}
go run multiiPad.goを実行した結果、
foo:[a b]
tmp.png:[0xc420082410]
作者:宋佳洋51 rebook K 8 s課程1.18日から授業が始まります.詳細はWeChatです.17812796384は理解に行きます.