우선 위 블로그를 참고하여 작성하였음을 밝힌다.
위의 포스팅 또한 굉장히 도움이 되었다.
감사의 말씀을 올린다.
지금 Go를 처음 깔아서 진짜 아무것도 모르는 상태로 API 서버를 만들어보려고 한다.
기본적인 지식으로는 파이썬을 이용해서 간단한 API 서버를 빌드해 본 적이 있고
역시 파이썬과 마크다운을 이용한 데이터 시각화 프론트 엔드 조금
그리고 C/C++ 프로젝트를 진행해 본적이 있다.
필요한 정보만 기록하고 나머지 정보는 생략하도록 하겠다.
// Go로 API 서버 만들기
Go에서는 package라는 단위로 모든 코드들이 묶여 있는데
다른 package를 불러와서 작성되어 있는 함수들을 사용할 수 있다.
조사결과 net/http 라는 package가 기본으로 제공되고 있다.
아래의 링크 참조
https://pkg.go.dev/net/http#pkg-examples
이 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 |
댓글