CafeM0ca

[Go] net/http routing 본문

Programming/Go

[Go] net/http routing

M0ca 2021. 3. 26. 13:09
반응형

net/http로 라우팅

요청된 경로나 요청 방식에 따라 다른 핸들러로 요청을 라우팅하는 기능이 필요.

go에서 ServeMux 인스턴스인 Default ServeMux 메서드에 의해 처리된다.

ListenAdnServe 함수의 handler 매개 변수로 nil에 전달되면 DefaultServeMux 메서드가 사용됨.

http.HandleFunc("/helloworld", helloWorldHandler) 패키지 함수를 호출하면 실제로는 간접적으로 http.DefaultServerMux.HanldeFunc(...)를 호출함.

Go HTTP 서버에는 지정된 라우터가 없음

http.Handler 인터페이스를 구현한 객체가 Listen() 함수의 최상위 함수로 전달됨.

  1. 요청이 서버로 들어옴
  2. 핸들러의 ServeHTTP 메서드 호출

다중 경로 처리를 용이하게 하기 위해 HTTP 패키지에는 http.Handler 인터페이스를 구현하는 ServeMux라는 특수한 객체가 있음.

ServeMux 핸들러에 추가할 수 있는 함수 2가지

func HandlerFunc(pattern string. handler func(ResponseWriter, *Request))
func Handle(pattern string, handler Handler)

PATH

ServeMux를 사용하면 등록된 경록를 명시해야 한다.

ServeMux는 간단한 라우팅 모델을 갖고 있어서 와일드카드/정규식을 지원하지 않는다.

/images/cat.jpg와 같이 루트부터 시작하는 고정 경로와

/images/와 같은 하위 경로를 모두 등록할 수 있다.

나머지는 51쪽 참조

편리한 핸들러

FileServer

정적 파일을 제공하는데 사용할 수 있다.

http.Handle("/images", http.FileServer(http.Dir("./images")))

위 코드를 통해 파일 시스템 경로 ./images의 내용을 서버 경로 /images에 매핑할 수 있는데, Dir 함수는 특정 디렉터리 트리로 제한되는 파일 시스템을 구현하며 FileServer 메서드는 이를 사용해 asset(이미지나 파일 등)을 서비스할 수 있다.

NotFoundHandler

404 페이지 찾을 수 없음 같은 간단한 요청 핸들러를 리턴

RedirectHandler

주어진 상태 코드(HTTP status code) 각 요청을 지정된 URL로 리다이렉션하는 요청 핸들러를 리턴함.

매개변수로 받는 코드는 300번대여야 함

func RedirectHandler(url string, coede int) Handler

StripPrefix

요청 URL의 경로에서 매개 변수로 받은 접두사를 제거한 다음에 h 매개변수의 핸들러를 호출해 HTTP 요청을 처리하는 핸들러를 리턴함.

경로가 존재하지 않으면 404 에러로 응답

TimeoutHandler

서비스의 cascanding 에러를 피하기 위해 사용함

결론 : GO 공식문서 잘 활용하자!

 

GET로 요청보내기

curl -X URL

e.g) curl -X 'localhost:8080/helloworld'

 

매개변수를 전달하고 싶은면

e.g) curl -X 'localhost:8080/helloworld?id=1234'

 

파라미터가 여러개면

e.g) curl -X 'localhost:8080/helloworld?id=1234&pw=abcd'

POST로 요청보내기

curl URL -d 'json'

e.g) curl localhost:8080/helloworld -d '{"name":"Nic", "id":"1234"}'

반응형

'Programming > Go' 카테고리의 다른 글

[Go] 패키지 네이밍(package naming)  (0) 2021.04.06
[Go] Go channel 데이터 파이프라인  (2) 2021.04.05
좋은 API 디자인  (0) 2021.03.26
[Go] Go 프로젝트 개발 환경 구축  (0) 2021.01.24
[Go] JSON encode/decode  (0) 2021.01.09
Comments