프로그래밍 기초/portfolio project

GET,POST 그리고 Content-type / Postman

NOG 2024. 9. 4. 00:31

GET /  POST

 
Method GET POST
목적 서버에서 데이터를 조회 사용 데이터 생성 및 업데이트 사용
데이터
전송방식

HTTP
패킷 Header에 데이터를 담아
URLquery 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 값

Body: HTTP request의 본문
 
 
참고 : https://www.heropy.dev/p/QOWqjV
 
*/

 

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으로 API 테스트 예시

 

Postman은 백엔드에서 생성한 REST API 제대로 작동하는지 테스트하는 도구이다.

GET 이외의 method들로 요청했을 때 결과값을 볼 수 있다.

Add request 후 검증할 METHOD( POST/GET/DELETE/PUT 등) 와 URL 주소 그리고 필요에 따라 방식과 type을 정한다.

후 Body 혹은 parameter 값을 넣고 전송(send)한다.

그리고 결과값을 확인, 위 이미지는 성공적으로 테스트 결과값이 나왔을 때(200) 모습이다.

 

500번 오류 예시

 

 

500번의 경우에는 코드 혹은 서버 문제이며 400번의 경우 클라이언트에 요청상에 문제가 있을 경우이다.

 

 

 

/*

flask에서 요청 데이터 다룰 때 메소드별로 사용하는  방법이다.

 

get 요청

request.args.get 사용  => URL 쿼리 스트링의 매개변수를 읽는다.

 

post 요청

- request.json.get  사용 => JSON 데이터가 파싱되어 Python 사전(dict)로 가져온.이 때 get 메서드를 사용하여 특정 키의 값을 가져올 수 있다.

 

*/

 

참고

 

https://inpa.tistory.com/entry/POSTMAN-%F0%9F%92%BD-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A7%A8-%EC%82%AC%EC%9A%A9%EB%B2%95-API-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%8F%99%ED%99%94-%EA%B3%A0%EA%B8%89-%ED%99%9C%EC%9A%A9%EA%B9%8C%EC%A7%80

https://ipekogosu.tistory.com/15

'프로그래밍 기초 > portfolio project' 카테고리의 다른 글

NGINX 와 서브도메인 연결  (0) 2024.10.02
OpenAI Assistant API 및 응답  (0) 2024.09.08
Python Flask 웹 서버 실행  (0) 2024.08.26