← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 47

URL parsing

Bedah alamat URL menjadi komponen-komponennya.

Pahami konsepnya

net/url mengurai alamat menjadi struktur teratur. url.Parse(teks) menghasilkan *url.URL dengan field siap baca: Scheme (https), Host (domain:port), Path (jalur), RawQuery (query mentah), Fragment (#bagian). Parse juga memvalidasi — alamat cacat mengembalikan error.

Query adalah bagian yang paling sering diolah: u.Query() mengubahnya menjadi url.Values — map[string][]string dengan method Get(kunci) untuk nilai pertama. Karena satu parameter bisa muncul berkali (?a=1&a=2), nilainya memang berbentuk slice; Encode() mengemas balik menjadi query string rapi dengan escaping benar.

Konstruksi arah sebaliknya juga mulus: buat url.Values, isi, lalu Encode untuk menyematkan pada URL keluar — cara aman membangun query tanpa menyusun string manual dan lupa escape karakter seperti spasi atau &.

Coba contoh kode

package main

import (
    "fmt"
    "net/url"
)

func main() {
    u, err := url.Parse("https://api.contoh.dev/v1/cari?q=golang&halaman=2&tag=web&tag=cli")
    if err != nil {
        return
    }

    fmt.Println(u.Scheme, u.Host, u.Path)
    q := u.Query()
    fmt.Println(q.Get("q"), q.Get("halaman"), q["tag"])
}

Tiga bagian alamat tercetak terpisah: https, api.contoh.dev, /v1/cari. Get mengambil nilai tunggal (q=golang, halaman=2) sedangkan akses map langsung q["tag"] menghasilkan seluruh nilai berulang [web cli] — pilihan bentuk mengikuti kebutuhan.

Membangun query dengan aman

func main() {
    q := url.Values{}
    q.Set("q", "belajar go gratis")
    q.Set("halaman", "3")

    alamat := "https://contoh.dev/cari?" + q.Encode()
    fmt.Println(alamat)
    // https://contoh.dev/cari?halaman=3&q=belajar+go+gratis
}

Spasi pada "belajar go gratis" otomatis menjadi + dan pasangan diurutkan — Encode menjamin query valid tanpa kamu menghafal aturan escaping. Menyusun query lewat Values selalu lebih aman daripada merangkai string + "?" + teks mentah.

Latihan singkat

Uji: ambil nilai `q` dan tag KEDUA — program harus mencetak persis `golang cli`.