[GO] net/http

타키탸키·2022년 11월 8일
0

GO-WEB

목록 보기
3/11

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 타입으로 받는다
      • Method, URL, Header 필드
    • 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)
      • ex:) 게시판에 게시글을 작성
    • data를 body에 넣고 싶을 때 사용하는 메서드
      • body에 데이터를 담아 보내기 때문에 HTTP 메세지에 body 존재
    • form을 body에 넣는 90%의 사례는 이 메서드 사용
  • GET 메서드
    • 클라이언트에서 서버로 정보를 요청하기 위해 사용(SELECT)
      • ex:) 게시판의 게시물 조회
    • URL을 통해 data를 전달하기 위한 메서드
      • HTTP 메세지에 body가 없다
      • 쿼리 string으로 url에 부착
      • "/?fname="James"
  • Form의 두 가지 data
    • url과 body
    • name
      • 사용자가 제출한 값을 지니고 있는 변수의 이름을 담은 변수
<!-- fname to url -->
<form action="/?fname=James" method="POST">
            <!-- fname to body -->
            <input type="text" name="fname" placeholder="first name" autofocus autocomplete="off">
</form>
  • Form
    • Request 구조체의 필드
    • form에서 data를 받게 한다
    • URL 쿼리 문자열과 body에서 오는 data 제공
    • PostForm
      • body에서 오는 data만 제공
    • 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와 관련된 것들을 설정해야 한다
      • 그 후 응답 작성 가능
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글