무지개곰
article thumbnail
반응형

웹 개발은 웹 페이지로부터 데이터를 읽어오거나 클라이언트로부터 데이터를 받아오는 것이 필요합니다. Go 언어를 사용하여 웹 서버에서 Query와 Fragment를 다루는 방법, JSON 데이터를 읽고 쓰는 방법을 알아보겠습니다.

1. 목차

Query String 데이터 처리

JSON 데이터 처리


2. Query String 데이터 처리

Query String은 URL에 포함된 데이터를 서버로 전달하는 데 사용됩니다. 일반적으로 '?' 문자 이후에 오며, 'key=value'로 이루어져 있습니다. 각 쌍은 '&'로 구분됩니다.

예시

<bash />
http://example.com/search?querykey=queryvalue&stringkey=stringvalue

위의 예시에서 'querykey=queryvalue''stringkey=stringvalue' 두 가지가 Query String부분입니다.

2.1. Query String 읽기

Go 언어에서 Query String을 읽으려면 'net/url' 패키지를 사용할 수 있습니다. 웹 서버의 경우 요청에서 query를 읽어올 수 있습니다.

2.1.1. net/url 사용하여 Query 읽기

<bash />
package main import ( "fmt" "net/url" ) func main() { urlString := "http://example.com/search?querykey=queryvalue&stringkey=stringvalue" parsedURL, err := url.Parse(urlString) if err != nil{ fmt.Println("error") return } queryParams := parsedURL.Query() queryvalue1 := queryParams.Get("querykey") queryvalue2 := queryParams.Get("stringkey") fmt.Println("querykey의 값 :",queryvalue1) fmt.Println("stringkey의 값 : ", queryvalue2) }

출력

실행 결과

url을 string 값으로 입력받아 'net/url' 패키지를 사용하여 parse후 Query의 값을 얻어왔습니다.

2.1.2. 웹 서버 요청에서 Query 읽기

웹 서버의 요청에 담긴 정보에서 QueryString을 확인하는 방법을 알아보겠습니다.

<bash />
package main import ( "fmt" "net/http" ) func main (){ port := ":8080" http.HandleFunc("/", testHandler) http.ListenAndServe(port,nil) } func testHandler(w http.ResponseWriter, r *http.Request){ queryParams := r.URL.Query() name := queryParams.Get("name") if name != ""{ fmt.Fprintln(w,"Hello,", name) }else { fmt.Fprintln(w, "Welcome!") } }

결과

위의 코드의 경우 서버를 실행하고 URL의 Query에 따라 출력이 다른 것을 확인할 수 있습니다.

net/url의 경우 string 타입을 url로 parse 하기 위하여 패키지를 사용한 것이고 그 이외에 query를 확인하는 과정은 동일한 것을 알 수 있었습니다.


3. JSON 데이터 처리

JSON(JavaScript Object Notation)은 데이터 교환을 위한 경량 데이터 형식으로 널리 사용됩니다. Go 언어에서 JSON 데이터를 읽고 쓰려면 'encoding/json' 패키지를 사용합니다.

3.0.1. JSON 읽기

웹 서버에서 JSON을 데이터를 사용하려면 요청의 Body에 담겨있는 JSON을 데이터를 읽고 구조체 필드에 값을 할당하여야 합니다.

<bash />
package main import ( "encoding/json" "fmt" "log" "net/http" ) type Person struct{ Name string `json:"name"` Age int `json:"age"` } func main(){ port := 8080 http.HandleFunc("/read",JsonReadHandler) log.Println("Rainbowbear Server Starting on port :", port) log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil)) } func JsonReadHandler(w http.ResponseWriter, r *http.Request){ var person Person decoder := json.NewDecoder(r.Body) err := decoder.Decode(&person) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } fmt.Printf("이름 : %s, 나이 : %d\n", person.Name, person.Age) w.Write([]byte("읽기 성공")) }

'/read' 경로로 JSON 파일을 보내면 'JsonReadHandler'가 JSON을 Person 구조체로 UnMarshal 합니다.

postman
터미널 출력

3.0.2. JSON 쓰기

Go 언어에서 JSON 데이터를 쓰려면 'encoding/json' 패키지를 사용하여 Go 구조체를 JSON 형식의 데이터로 Marshal 합니다.

<bash />
package main import ( "encoding/json" "fmt" "log" "net/http" ) type Person struct{ Name string `json:"name"` Age int `json:"age"` } func main(){ port := 8080 http.HandleFunc("/read",JsonReadHandler) log.Println("Rainbowbear Server Starting on port :", port) log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil)) } func JsonWriteHandler(w http.ResponseWriter, r *http.Request){ person := Person{ Name : "RainbowBear", Age : 100, } responseJSON, err := json.Marshal(person) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write(responseJSON) }

'JsonWriteHandler'는  'Person' 구조체를 JSON으로 Marshal 합니다.

마지막 3줄에 대한 설명은 아래와 같습니다.

1. 'w.Header().Set("Content-Type", "application/json")'은 HTTP 응답 헤더에 접근하여 응답의 'Content-Type'헤더를 응답이 JSON형식으로 설정합니다.

2. 'w.WriteHeader(http.StatusOK)'는 응답 상태코드를 'http.StatusOK'로 설정하여 요청이 성공적으로 처리되었음을 알립니다.

3. 'w.Write(responseJSON)''w.Write()'메서드를 통하여 응답할 데이터를 지정합니다.

postman

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!