웹 개발은 웹 페이지로부터 데이터를 읽어오거나 클라이언트로부터 데이터를 받아오는 것이 필요합니다. Go 언어를 사용하여 웹 서버에서 Query와 Fragment를 다루는 방법, JSON 데이터를 읽고 쓰는 방법을 알아보겠습니다.
목차
Query String 데이터 처리
JSON 데이터 처리
Query String 데이터 처리
Query String은 URL에 포함된 데이터를 서버로 전달하는 데 사용됩니다. 일반적으로 '?' 문자 이후에 오며, 'key=value'로 이루어져 있습니다. 각 쌍은 '&'로 구분됩니다.
예시
http://example.com/search?querykey=queryvalue&stringkey=stringvalue
위의 예시에서 'querykey=queryvalue'와 'stringkey=stringvalue' 두 가지가 Query String부분입니다.
Query String 읽기
Go 언어에서 Query String을 읽으려면 'net/url' 패키지를 사용할 수 있습니다. 웹 서버의 경우 요청에서 query를 읽어올 수 있습니다.
net/url 사용하여 Query 읽기
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의 값을 얻어왔습니다.
웹 서버 요청에서 Query 읽기
웹 서버의 요청에 담긴 정보에서 QueryString을 확인하는 방법을 알아보겠습니다.
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를 확인하는 과정은 동일한 것을 알 수 있었습니다.
JSON 데이터 처리
JSON(JavaScript Object Notation)은 데이터 교환을 위한 경량 데이터 형식으로 널리 사용됩니다. Go 언어에서 JSON 데이터를 읽고 쓰려면 'encoding/json' 패키지를 사용합니다.
JSON 읽기
웹 서버에서 JSON을 데이터를 사용하려면 요청의 Body에 담겨있는 JSON을 데이터를 읽고 구조체 필드에 값을 할당하여야 합니다.
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 합니다.
JSON 쓰기
Go 언어에서 JSON 데이터를 쓰려면 'encoding/json' 패키지를 사용하여 Go 구조체를 JSON 형식의 데이터로 Marshal 합니다.
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()'메서드를 통하여 응답할 데이터를 지정합니다.
'Go language' 카테고리의 다른 글
[Go] 데이터 압축하기 (compress/gzip 사용하기) (0) | 2023.09.11 |
---|---|
[Go] RESTful API 설계 (HTTP 메서드 사용, gorila/mux) (0) | 2023.09.05 |
[Go] TCP / RPC 서버 만들기 (net/rpc 패키지, TCP와 RPC 차이) (0) | 2023.09.02 |
[Go] 웹 서버 만들기 (net/http, Mux, DefaultServeMux) (0) | 2023.09.01 |
[Go] 채널 이해하기 (콘텍스트) (0) | 2023.08.28 |