본문 바로가기

프로그래밍/golang

[Golang] net/url 기초

 

API 호출을 위해 외부 URL을 생성하거나 들어온 URL 파싱할 때 쓰는 표준 라이브러리 "net/url"

1. URL 구조체

URL 구조체는 Scheme, Host, Path, Query 등으로 이루어져 있습니다.

u := url.URL{
    Scheme: "https",
    Host:   "example.com",
    Path:   "/search",
}

 

2. Query 인코딩

보통 그냥 하드코딩해서 쓰면 &,? 같은 특수 문자를 포함할 때 실수가 일어나는데,

url.Value를 활용하면 실수를 줄이고 안전하게 URL를 만들 수 있습니다.

q := url.Values{}
q.Set("q", "go handbook")
q.Set("page", "1")
u.RawQuery = q.Encode()

fmt.Println("built url:", u.String()) 

// result: https://example.com/search?page=1&q=go+handbook

 

 

3. URL 파싱 및 쿼리 추출

parsed, _ := url.Parse(u.String())
fmt.Println("parsed host:", parsed.Host)         // example.com
fmt.Println("query q:", parsed.Query().Get("q")) // go handbook

 

 

4. net/url 주요 메서드

func sample() {
	v := url.Values{}
	v.Set("id", "reo109")   // 기존에 "id"가 있다면 덮어쓰고, 없으면 새로 만듭니다.
	v.Add("tag", "go")      // 기존 "tag"를 유지하며 새로운 값을 리스트에 추가합니다.
	v.Add("tag", "backend") // tag=go&tag=backend
	v.Get("tag")            // 해당 키의 "첫 번째" 값만 반환합니다.
	v.Has("mode")           // 특정 키가 있는지 확인합니다.
	v.Del("id")             // 해당 키와 연결된 모든 값을 지웁니다.
	v.Encode()              // 전체 데이터를 "key=value&..." 형태의 문자열로 변환합니다.

	u, _ := url.Parse("https://example.com")
	u.JoinPath("api", "v1") // 슬래시(/) 중복을 방지하며 경로를 안전하게 붙입니다.
	u.String()              // 전체 URL 구조체를 하나의 문자열로 반환합니다.
	u.RequestURI()          // 호스트를 제외한 "/path?query" 부분만 가져옵니다.

	url.QueryEscape("a&b c") // 특수문자와 공백을 쿼리 규격에 맞게 변환합니다. (결과: a%26b+c)
	url.PathEscape("a&b c")  // URL 경로 규격에 맞게 변환합니다. (결과: a%26b%20c)
}

 

5. 전체 코드

https://github.com/reochoi109/go-handbook/blob/main/url/basic/main.go

 

go-handbook/url/basic/main.go at main · reochoi109/go-handbook

A personal handbook of Go patterns and best practices. Lightweight, practical code snippets for real-world backend development. - reochoi109/go-handbook

github.com