net/http package overview
- Handler 인터페이스
ServeHTTP
를 가지고 있는 인터페이스
- 요청 데이터를 받아 응답을 해주는 역할
- 이 메서드를 직접 구현하여
ListenAndServe
의 파라미터로 제공 가능
Handle
함수에 필요한 인자
- 경로 별로 요청을 처리할 핸들러를 등록하는 함수
ServeHTTP
메서드가 구현된 타입만 Handle
함수의 두 번째 인자로 사용 가능
- 인터페이스의 다형성을 고려하여 어느 곳에 사용할 지가 중요
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
ServeHTTP(ResponseWriter, *Request)
- 클라이언트가 서버에 요청을 하면 서버에서는 응답 작성
- HTTP를 제공하는 방법이면서 서버에 들어오는 요청을 처리하는 방법
- 서버가 HTTP 제공
- Handler 인터페이스가 서버에 들어오는 요청 처리
- ResponseWriter
- 인터페이스
- Header와 Write, WriteHeader를 가짐
- 응답 시, 헤더 사용 가능
- ServeHTTP의 두번째 인자
- writer 인터페이스를 구현하여 HTTP Response에 응답 작성 가능
- Request
- 요청을 struct 타입으로 받는다
- Header 필드
- MultipartForm의 RemoteAddr
- 로깅을 위해 HTTP 서버와 다른 SW가 요청을 전송하는 네트워크 주소를 기록하도록 허용
type Request struct {
Method string
URL *url.URL
// Header = map[string][]string {
// "Accept-Encodeing": {"gzip", "deflate"},
// "Accept-Language": {"en-us"},
// "Foo": {"Bar", "two"}
// }
Header Header
}
http.ListenAndServe
- HTTP 연결을 받고 요청에 응답하는 함수
- Handler 타입의 값을 인자로 받는다
- 서버에 들어오는 모든 요청에 메서드 실행
- 라우팅을 하는 MUX 기능
- 인자를 받은 주소로 요청이 들어오면 Handler로 처리한다
- HTTPS(보안 HTTP)는
http.ListenAndServeTLS
를 사용하며 certFile과 keyFile도 제공
- TLS
- 새로운 SSL
- 전송 계층 보안으로 HTTPS를 수행하는 새로운 방식
- 핸들러
Request
- form data 처리 방법
- 사용자가 웹 사이트에서 form(data) 제출
- 서버에서 제출한 data와 연관된 작업 수행
- form은 HTTP를 따른다
- 시작 라인 / 헤더 / 바디
- form의 data는 바디 or URL에 들어갈 수 있다
- POST 메서드
- 클라이언트에서 서버로 리소스를 생성하거나 업데이트하기 위해 데이터를 보낼 때 사용(CREATE)
- data를 body에 넣고 싶을 때 사용하는 메서드
- body에 데이터를 담아 보내기 때문에 HTTP 메세지에 body 존재
- form을 body에 넣는 90%의 사례는 이 메서드 사용
- GET 메서드
- 클라이언트에서 서버로 정보를 요청하기 위해 사용(SELECT)
- URL을 통해 data를 전달하기 위한 메서드
- HTTP 메세지에 body가 없다
- 쿼리 string으로 url에 부착
"/?fname="James"
- Form의 두 가지 data
- url과 body
- name
- 사용자가 제출한 값을 지니고 있는 변수의 이름을 담은 변수
<form action="/?fname=James" method="POST">
<input type="text" name="fname" placeholder="first name" autofocus autocomplete="off">
</form>
- Form
- Request 구조체의 필드
- form에서 data를 받게 한다
- URL 쿼리 문자열과 body에서 오는 data 제공
- PostForm
- ParseForm을 호출한 다음에만 사용 가능
- Request의 메서드
- request body를 읽고 form으로 파싱한 후, 결과를 Request Form에 넣음
- URL의 raw query 파싱하고 Form 갱신
- 절차
- 사용자가 ListenAndServe 함수의 인자로 넘긴 주소에 접속
- Handler 실행
- ParseForm을 통해 query를 파싱하고 Form 갱신
- 파싱 된 data(url, query parameter)를 가진 Form을 통해 url, body data에 접근
- Request 타입의 필드인 Method, url, header, host, content length 등에 접근 가능
- ExecuteTemplate를 통해 새로운 Form 제출
- 새로운 Form 화면에 랜더링
- 쿼리 스트링으로 넘어온 data가 파싱되어 화면에 출력됨
- 사용자가 특정 값을 입력하면 body의 data가 파싱되어 화면에 출력됨
- FormValue
- Reqest의 메서드
- 쿼리에서 이름이 있는 컴포넌트의 첫번재 값 반환
- POST와 PUT body의 매개 변수는 URL 쿼리의 문자열 값보다 우선으로 처리된다
- 필요할 경우, ParseMultipartForm과 ParseForm을 호출하고 이 함수들이 반환하는 오류는 무시
- 적재적소에 값을 입력할 수 있도록 돕는 메서드
- key를 입력하면 key에 대한 value를 돌려준다
Response
- ResponseWriter
- Header, Write, WriteHeader 메서드가 있으면 ResponseWriter에 해당
- WriteHeader가 상태 코드와 함께 HTTP 응답 header 전송
- WriteHeader 호출 후, header를 바꾸는 것은 효과가 없다
- 응답 header를 전송하면 Header가 header map 회신
- Header
- map[string][]string 타입
.Set
- header 설정하기
- 설정한 내용은 브라우저 검사 탭에서 확인 가능
- header를 작성하기 전에 header와 관련된 것들을 설정해야 한다