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`.