← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 50

Simple client HTTP request

Konsumsi API dari sisi klien.

Pahami konsepnya

Sisi klien juga tinggal satu baris: resp, err := http.Get(alamat) melakukan permintaan GET dan mengembalikan respons berisi StatusCode, Header, dan Body. Body adalah stream — baca dengan io.ReadAll lalu TUTUP dengan defer resp.Body.Close(); lupa menutup membuat koneksi menumpuk dan bocor.

Untuk metode lain dan body kiriman, bangun permintaan eksplisit: http.NewRequest(http.MethodPost, alamat, bytes.NewReader(dataJson)), pasang header r.Header.Set("Content-Type", "application/json"), lalu kirim lewat http.DefaultClient.Do(r). Pola yang sama mengirim token auth atau API key di header.

Status 4xx/5xx BUKAN error Go — permintaan sukses dijalankan, server menolak. Periksa resp.StatusCode sendiri dan ubah menjadi error aplikasimu. Timeout klien juga diatur manual: buat &http.Client{Timeout: 10 * time.Second} alih-alih memakai DefaultClient yang menunggu tanpa batas.

Coba contoh kode

package main

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

func main() {
    resp, err := http.Get("https://httpbin.org/get")
    if err != nil {
        fmt.Println("gagal:", err)
        return
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println("status:", resp.StatusCode)
    fmt.Println("panjang body:", len(body), "byte")
}

Get menjalankan permintaan penuh: DNS, TCP, TLS, lalu menyerahkan respons. err hanya muncul untuk kegagalan jaringan — server menjawab 404 tetap dianggap sukses secara transport. Body wajib ditutup; tanpa defer Close, program intensif API pelan-pelan kehabisan koneksi.

POST JSON ke API

func kirim() error {
    payload, _ := json.Marshal(map[string]string{"nama": "Citra"})

    req, err := http.NewRequest(http.MethodPost,
        "https://httpbin.org/post", bytes.NewReader(payload))
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", "application/json")

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

    if resp.StatusCode != http.StatusOK {
        return fmt.Errorf("server menjawab %d", resp.StatusCode)
    }
    return nil
}

NewRequest menyiapkan metode, alamat, dan body (bytes.NewReader membungkus JSON jadi io.Reader). Header dipasang pada req sebelum Do mengirimkannya. Pemeriksaan StatusCode mengubah penolakan server menjadi error yang bisa ditangani — pemisahan "gagal kirim" vs "ditolak" ini penting untuk retry logic.

Latihan singkat

Uji: buat server uji lokal dengan httptest, lalu GET darinya — program harus mencetak persis `200`.