GET / POST
Method | GET | POST |
목적 | 서버에서 데이터를 조회 시 사용 | 데이터 생성 및 업데이트 시 사용 |
데이터 전송방식 |
HTTP 패킷 Header에 데이터를 담아 URL의 query string을 통해 전송 |
HTTP 패킷 Body에 데이터를 담아 URL에 포함되지 않고 Body를 통해 전송 |
멱등성 | 데이터를 조회할 때 사용하므로 여러 번 요청하더라도 응답이 같다. |
데이터를 생성하고 업데이트 시 사용하므로 서버(안 데이터)가 변경될 수 있어 여러 번 요청 시 결과가 달라질 수 있다. |
데이터 크기 |
간단한 데이터 | 큰 데이터 |
보안 | URL에 데이터가 노출 | URL에 노출되지 않아 상대적으로 안전 |
캐싱 | 브라우저에 캐시가능하다. | 브라우저에 캐시되지 않는다. |
예시 | /sendMessage?user_input=hello | /sendMessage (바디에 담겨 보이지 않음) json, xml, 파일 업로드 등 |
요약 | 둘 다 데이터를 전송할 수 있지만 서버에 데이터를 생성 및 업데이트 용도나 큰 용량의 데이터 관련은 상대적으로 안전한 POST 방식을 사용하는 것이 좋다. 데이터를 URL 상에서 확인한다는 점, 이전에 요청한 결과를 재사용할 수 있다는 점 그리고 간편하게 데이터를 조회할 수 있다는 점에서 GET이 좋다. |
GET 메소드로도 JSON 데이터를 전송할 수 있다.
API 호출 시 POST 메소드를 사용하는 이유는 대량의 JSON 데이터를 전송하기 적합한 것도 있고 데이터를 URL 대신 Body에 담기 때문에 보안적인 목적이 크다.
/*
query string: ? 뒤에 key와 value 값
Content-Type
HTTP 패킷 body의 데이터의 타입으로 이것에 따라 데이터를 받는측(브라우저 또는 웹서버)가 어떤 형식인지 판단하고 어떻게 분석,파싱할지 정하고 해석하고 처한다.
Content-type 없이 보내면 단순 텍스트 데이터로 받으며 GET 방식 또한 value=text 형식으로 보내지기 때문에 Content-type이 필요없다.
POST나 PUT처럼 Body에 data를 보낼 때 Content-type이 필요하다.
axios를 사용해 클라이언트가 서버에서 API 요청 시 Contet-type을 application/json으로 지정한다.
MIME 타입(전자우편을 이한 인터넷 표준 포맷) 에 정의된 것을 사용한다.
type/subtype
ex) application/xml, image/png
application/x-www-form-urlencoded
모든 입력값이 key1=value1&key2=value2의 형식으로, 모든 특수 문자는 URL 인코딩된다.
데이터가 URL 인코딩된 형식으로 파싱된다.
html form에서 데이터 전송 시 기본 content-type이다.
POST /submit HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
name=Nog&email=Nog%40example.com
multipart/form-data
주로 이미지나 파일 업로드 같은 큰 양의 데이터 전송에 사용된다.
--boundary 로 데이터를 여러 부분으로 나누어 값을 지정한다.
<form> 태그를 통해 브라우저에서 서버로 전송할 때 사용한다.
이미지를 올린다면 이미지와 이미지에 대한 설명 두개의 다른 input 간에 content type이 body에 들어가는데 이래서 등장한 것이 multipart이다
/*
Content-Disposition 응답 헤더는 콘텐츠라 브라우저 내부에 보여질 것인지, 아니면 다운로드돼서 로컬에 저장될 것인지를 알려주는 헤더다.
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
inline - 기본값으로, 웹페이지 내부에 display
attachment - 다운로드 해야되는 거라고 명시
attchment; filename - '다른 이름으로 저장'을 하려면 filename 같이 넣어준다
브라우저가 해당 컨텐츠를 표시할 수 없는 형식이거나, 항상 다운로드하도록 유도하고 싶다면 헤더에 Content-Disposition을 꼭 넣어주어야 한다
참고 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
Body에 담길 data가 커서 HTTP response가 여러 번 나가야 한다면(multipart) 아래와 같은 형식으로 나가게 된다.
*/
------WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="name"
Nog
------WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
(file data)
------WebKitFormBoundaryE19zNvXGzXaLvS5C--
application/json
JSON 형식으로 데이터를 주고 받을 때 사용, 주로 API 요청 및 등에 사용
{
"name": "Nog",
}
application/octet-stream
바이너리 데이터 전송 시 사용
지정된 파일 형식이 없을 때, 파일을 전송하기 위해 사용할 수 있다.
다운로드용 파일을 전송할 때 많이 사용한다.
application/xml
브라우저는 XML 데이터를 인식
text/plain
브라우저는 텍스트 데이터로 인식
text/html
브라우저는 HTML 문서로 인식
text/javascript
브라우저는 Javascript문서로 인식
Form Data
웹에서 사용자 입력을 서버로 전송하는 방식 중 하나이다.
텍스트필드, 체크박스, 라디오버튼, 드롭다운 목록, 파일입력, 숨은필드 등이 있다. (input type)
form 필드와 그 값을 나타내는 일련의 key/value 쌍을 쉽게 생성할 수 있는 방법을 제공하는 데이터
ex) username= nog / password=nog
폼을 통해 전송되는 데이터를 의미, 데이터를 서버로 전송하는 방법이다.
( HTML 폼 그리고 자바스크립트에서도 FormData() 클래스를 이용해 똑같이 스크립트로도 전송을 할수 있다.)
로그인, 회원가입, 검색, 파일 업로드 시 사용된다.
주로 웹 페이지에서 <form> 태그를 이용해 사용자 입력 input 값을(검색폼,파일 업로드등) 서버로 전송하는데 사용된다.
POST 요청의 body에 포함되어 key=value 형식으로 서버로 전송된다.
Postman을 사용하여 REST API 테스트
Postman은 백엔드에서 생성한 REST API 제대로 작동하는지 테스트하는 도구이다.
GET 이외의 method들로 요청했을 때 결과값을 볼 수 있다.
Add request 후 검증할 METHOD( POST/GET/DELETE/PUT 등) 와 URL 주소 그리고 필요에 따라 방식과 type을 정한다.
그 후 Body 혹은 parameter 값을 넣고 전송(send)한다.
그리고 결과값을 확인, 위 이미지는 성공적으로 테스트 결과값이 나왔을 때(200) 모습이다.
500번의 경우에는 코드 혹은 서버 문제이며 400번의 경우 클라이언트에 요청상에 문제가 있을 경우이다.
/*
flask에서 요청 데이터 다룰 때 메소드별로 사용하는 방법이다.
get 요청
request.args.get 사용 => URL 쿼리 스트링의 매개변수를 읽는다.
post 요청
- request.json.get 사용 => JSON 데이터가 파싱되어 Python 사전(dict)로 가져온.이 때 get 메서드를 사용하여 특정 키의 값을 가져올 수 있다.
*/
참고
'프로그래밍 기초 > portfolio project' 카테고리의 다른 글
NGINX 와 서브도메인 연결 (0) | 2024.10.02 |
---|---|
OpenAI Assistant API 및 응답 (0) | 2024.09.08 |
Python Flask 웹 서버 실행 (0) | 2024.08.26 |