LoginSignup
0
0

More than 3 years have passed since last update.

[Go] GET リクエスト & レスポンスの取り扱い方

Posted at

サーバー側の実装例をよくみかけますがk、GO ではクライアント側の実装もできます。

基本的な GET リクエスト

まずは、基本から。

package main

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

func main() {
    url := "http://localhost:8080"
    resp, err := http.Get(url)
    if err != nil {
        log.Fatalln("Failed to get response")
    }

    content, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln("Failed to read content")
    }
    defer resp.Body.Close()

    fmt.Println(string(content))
}

netcat を使ってリクエスト内容を確認 (= nc -l 8080)。

GET / HTTP/1.1
Host: localhost:8080
User-Agent: Go-http-client/1.1
Accept-Encoding: gzip

標準では User-Agent: Go-http-client/1.1 ですね。

リクエストヘッダーにカスタムの情報を追加・編集

User-Agent を別の情報で表示する場合は、ヘッダーの編集が必要

package main

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

func main() {
    url := "http://localhost:8080"

    // Client 型を取得
    client := http.DefaultClient

    // Request 型 (ポインタ) を取得
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatalln("Failed to create reqeust")
    }

    // 任意の Header を作る。ここでは、Agent 名を変更
    req.Header.Add("User-Agent", "Custom Agent")

    // リクエストを送信、レスポンスを resp に入れる
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln("Failed to get response")
    }

    content, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln("Failed to read content")
    }
    defer resp.Body.Close()

    fmt.Println(string(content))
}

netcat を使ってリクエスト内容を確認 (= nc -l 8080)。

GET / HTTP/1.1
Host: localhost:8080
User-Agent: Custom Agent # ちゃんと変わってる
Accept-Encoding: gzip

Basic 認証

Basic 認証の仕組みを理解するついでに調べました。

package main

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

func main() {
    url := "http://localhost:8080"

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatalln("Failed to create request")
    }

    // Basic 認証用の ID & Password
    req.SetBasicAuth("user", "passw0rd")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatalln("Failed to get response")
    }

    content, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln("Failed to read content")
    }
    defer resp.Body.Close()

    fmt.Println(string(content))
    fmt.Println(resp.StatusCode)
}

netcat を使ってリクエスト内容を確認 (= nc -l 8080)。

GET / HTTP/1.1
Host: localhost:8080
User-Agent: Go-http-client/1.1
Authorization: Basic dXNlcjpwYXNzdzByZA==  # base64 デコードすると user:passw0rd
Accept-Encoding: gzip

ヘッダーに base64 エンコードされた ID & パスワードを入れるとなると、確かに安全ではないですね。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0