いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-184 (Goで http GET と POST のリクエストの発行)

概要

以下は自分用のメモです。よく忘れるので、ここにメモメモ。。

Getリクエスト

//
// http.Get() を使って HTTP GET リクエストを試してみるサンプルです。
//
// リクエストの発行先は JSONPlaceholder (https://jsonplaceholder.typicode.com/) を
// 使わせてもらっています。
//
// REFERENCES:
//   - https://dev.to/devkiran/make-an-http-get-request-in-go-58gf
//
package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
)

type Post struct {
    UserId int    `json:"userId"`
    Id     int    `json:"id"`
    Title  string `json:"title"`
    Body   string `json:"body"`
}

func (me *Post) String() string {
    return fmt.Sprintf("Uid: %d, Id: %d, Title: %s..., Body: %s...", me.UserId, me.Id, me.Title[:5], me.Body[:5])
}

const (
    url = "https://jsonplaceholder.typicode.com/posts/1"
)

var (
    appLog = log.New(os.Stderr, "", 0)
    errLog = log.New(os.Stderr, "[Error] ", 0)
)

func main() {
    // -------------------------------------------
    // Send http GET request
    // -------------------------------------------

    res, err := http.Get(url)
    if err != nil {
        errLog.Println(err)
        return
    }
    defer res.Body.Close()

    // -------------------------------------------
    // Check http status code
    // -------------------------------------------

    if res.StatusCode != http.StatusOK {
        errLog.Printf("http status code: %d", res.StatusCode)
        return
    }

    // -------------------------------------------
    // Decode response to JSON
    // -------------------------------------------

    var (
        post    = &Post{}
        decoder = json.NewDecoder(res.Body)
    )

    err = decoder.Decode(post)
    if err != nil {
        errLog.Println(err)
        return
    }

    // -------------------------------------------
    // Show results
    // -------------------------------------------

    appLog.Printf("status: %d, resonse: %s\n", res.StatusCode, post)
}

実行すると以下のようになります。

gitpod /workspace/try-golang (master) $ go run cmd/httpget/main.go 
status: 200, resonse: Uid: 1, Id: 1, Title: sunt ..., Body: quia ...

try-golang/main.go at master · devlights/try-golang · GitHub

POSTリクエスト

//
// http.NewRequest() を使って HTTP POST リクエストを試してみるサンプルです。
//
// リクエストの発行先は JSONPlaceholder (https://jsonplaceholder.typicode.com/) を
// 使わせてもらっています。
//
// REFERENCES:
//   - https://dev.to/devkiran/make-an-http-post-request-in-go-29p
//
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
)

type (
    Post struct {
        UserId int    `json:"userId"`
        Id     int    `json:"id"`
        Title  string `json:"title"`
        Body   string `json:"body"`
    }
)

func (me *Post) String() string {
    return fmt.Sprintf("Uid: %d, Id: %d, Title: %s, Body: %s", me.UserId, me.Id, me.Title, me.Body)
}

const (
    method      = "POST"
    url         = "https://jsonplaceholder.typicode.com/posts"
    contentType = "application/json"
)

var (
    appLog = log.New(os.Stdout, "", 0)
    errLog = log.New(os.Stderr, "[Error] ", 0)
)

func main() {
    // -------------------------------------------
    // Create request and set headers
    // -------------------------------------------

    var (
        body = []byte(`{"userId": 999, "title": "try-golang", "body": "try-golang/cmd/httppost"}`)
        buf  = bytes.NewBuffer(body)
    )

    req, err := http.NewRequest(method, url, buf)
    if err != nil {
        errLog.Println(err)
        return
    }
    req.Header.Add("Content-Type", contentType)

    // -------------------------------------------
    // Send http POST request
    // -------------------------------------------

    var (
        client = &http.Client{}
    )

    res, err := client.Do(req)
    if err != nil {
        errLog.Println(err)
        return
    }
    defer res.Body.Close()

    // -------------------------------------------
    // Check http status code
    // -------------------------------------------

    if res.StatusCode != http.StatusCreated {
        errLog.Printf("http status code: %d", res.StatusCode)
        return
    }

    // -------------------------------------------
    // Decode response to JSON
    // -------------------------------------------

    var (
        post    = &Post{}
        decoder = json.NewDecoder(res.Body)
    )

    err = decoder.Decode(post)
    if err != nil {
        errLog.Println(err)
        return
    }

    // -------------------------------------------
    // Show results
    // -------------------------------------------

    appLog.Printf("status: %d, resonse: %s\n", res.StatusCode, post)
}

実行すると以下のようになります。

gitpod /workspace/try-golang (master) $ go run cmd/httppost/main.go 
status: 201, resonse: Uid: 999, Id: 101, Title: try-golang, Body: try-golang/cmd/httppost

try-golang/main.go at master · devlights/try-golang · GitHub


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。