Golang REST API 만들기
오늘은 Golang으로 간단한 REST API를 만드는 방법을 쓸까 한다. 바로 시작하자 우선은 Directory를 하나 만들고 시작 mkdir rest go module 등록 go mod init noah.io/ark/rest main.go 생성 touch main.go Direc..
woony-sik.tistory.com
우선 위 블로그를 참고하여 작성하였음을 밝힌다.
예제로 배우는 Go 프로그래밍 - Go 프로그래밍 언어 소개
1. Go 개발자들 GO 프로그래밍 언어는 2007년 구글에서 개발을 시작하여 2012년 GO 버젼 1.0을 완성하였다. GO는 이후 계속 향상된 버젼을 내 놓았으며 2015년 말에는 1.5.2 버젼에 이르렀다. 흔히 golang 이
golang.site
위의 포스팅 또한 굉장히 도움이 되었다.
감사의 말씀을 올린다.
지금 Go를 처음 깔아서 진짜 아무것도 모르는 상태로 API 서버를 만들어보려고 한다.
기본적인 지식으로는 파이썬을 이용해서 간단한 API 서버를 빌드해 본 적이 있고
역시 파이썬과 마크다운을 이용한 데이터 시각화 프론트 엔드 조금
그리고 C/C++ 프로젝트를 진행해 본적이 있다.
필요한 정보만 기록하고 나머지 정보는 생략하도록 하겠다.
// Go로 API 서버 만들기
Go에서는 package라는 단위로 모든 코드들이 묶여 있는데
다른 package를 불러와서 작성되어 있는 함수들을 사용할 수 있다.
조사결과 net/http 라는 package가 기본으로 제공되고 있다.
아래의 링크 참조
https://pkg.go.dev/net/http#pkg-examples
http package - net/http - pkg.go.dev
HTTP Trailers are a set of key/value pairs like headers that come after the HTTP response, instead of before. package main import ( "io" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/sendstrailers", func(w http.ResponseWriter, req *
pkg.go.dev
이 net/http를 호출하고 사용하여 http를 이용한 RESTful API 서버를 만들 수 있다.
// GET
가장 간단한 서버를 만들어 본다.
이렇게 실행하면
성공했다. 이걸로 원하는 응답을 작성할 수 있다.
// POST
POST API를 사용해서 원하는 형태의 json을 받아보고 분석해보자.
그러기 위해서는 우선 json을 인코딩/디코딩 할 수 있는 패키지가 필요하다.
내장되어 있는 encoding/json 패키지를 불러오면 된다.
주고받는 값을 확인할 수 있게 터미널에 출력하는 부분도 필요하다.
fmt 패키지를 이용하겠다.
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type ReqInfo struct {
Request_name string
Request_email string
}
func main() {
// localhost:port/
http.HandleFunc("/", func(wr http.ResponseWriter, r *http.Request) {
wr.Write([]byte("This is main page."))
})
// localhost:port/json
http.HandleFunc("/json", func(wr http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodPost {
var user_info ReqInfo
json.NewDecoder(r.Body).Decode(&user_info)
fmt.Println(user_info)
json.NewEncoder(wr).Encode(user_info)
}
})
http.ListenAndServe(":8880", nil)
}
POST 요청을 보내는 작업은 postman 이라는 어플을 사용했다.
굉장히 편하다.
받은 요청의 메소드가 POST 인 경우에만 실행하도록 하였다.
받은 요청을 encoding/json 로 파싱하기 위해
디코더를 생성하고 파싱했고 user_info 에 내용을 담았다.
담은 내용은 그대로 터미널에 출력하고 다시 응답에 담아서 보냈다.
응답과 터미널의 내용을 확인할 수 있다.
user_info는 ReqInfo 라는 구조체로 정의되는데
이때 특이한 점은 이 ReqInfo라는 구조체를 선언할 때
무조건 구조체 내부의 변수 이름이 대문자로 시작해야 동작한다. 이 부분은 좀 더 조사해 볼 것.
아무튼 json 에 들어있는 키 값과 구조체의 변수 이름이 일치하면 파싱해서 구조체의 변수에 넣어준다.
아직 완벽하게 이해하지는 못했다.
순서만 지키면 되므로 예컨데 이런 방법도 된다.
구조체를 이렇게 바꾸고
요청을 이렇게 보내면
잘 동작한다.
요청을 보낼 때 숫자를 따옴표로 감싸면 타입이 맞지 않으므로 int의 default값인 0이 출력된다.
'코딩 아카이브 > Golang' 카테고리의 다른 글
TDD와 cleancode로 만들면서 배우면서 Golang backend -4 (0) | 2022.04.20 |
---|---|
TDD와 cleancode로 만들면서 배우면서 Golang backend -3 (0) | 2022.04.15 |
TDD와 cleancode로 만들면서 배우면서 Golang backend -2 (0) | 2022.04.11 |
TDD와 cleancode로 만들면서 배우면서 Golang backend -1 (0) | 2022.04.10 |
맨땅에 헤딩하는 Go 백엔드 2 (0) | 2022.03.01 |
댓글