가장 중요한 파트이면서 어려운 파트,,
API의 역할
1. API는 서버와 데이터베이스에 대한 출입구 역할을 한다.
2. API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다.
3. API는 모든 접속을 표준화한다.
1) private API**: private API는 내부 API로, 회사 개발자가 자체 제품과 서비스를 개선하기 위해 내부적으로 발행합니다. 따라서 제 3자에게 노출되지 않습니다.
2) public API**: public API는 개방형 API로, 모두에게 공개됩니다. 누구나 제한 없이 API를 사용할 수 있는 게 특징입니다.
3) partner API**:partner API는 기업이 데이터 공유에 동의하는 특정인들만 사용할 수 있습니다. 비즈니스 관계에서 사용되는 편이며, 종종 파트너 회사 간에 소프트웨어를 통합하기 위해 사용됩니다.
Http 패킷
:클라이언트가 서버로 요청 할 때, 보내는 데이터를 HTTP 패킷이라 표현
HTTP 패킷의 구조는 크게 '헤더'와 '바디'로 나뉘어진다.
헤더에는 HTTP 메서드 방식중 무엇을 썻는지, 클라이언트의 정보, 브라우저 정보, 접속할 URL 등등 과 같은 클라이언트 정보를 담습니다.
바디는 보통 비어있다가, 특정 데이터를 담아서 서버에게 요청을 보낼 수 있습니다.
⇒ 구체적으로
요청헤더 (Request Header) : 요청하는 페이지의 주소와 현재 컴퓨터의 정보가 전송되는 부분입니다.
요청바디 (Request Body) : POST 요청시 전송되는 데이터가 들어가는 부분입니다. GET 요청 때는 빈칸 입니다.
응답헤더 (Response Header) : 응답 페이지의 상태와 서버에 관한 정보가 전송되는 부분입니다.
응답바디 (Response Body) : 페이지의 HTML 소스가 전송되는 부분입니다.
Http 메소드
엔드포인트주소/엔드포인트주소?파라미터=값&파라미터=값
데이터 포맷
비정형 데이터
2. CSV
(comma separated value)
별도의 구분 기호로 데이터를 구분하여 표시
다른 사람이 데이터를 구분하기 쉽지 않다.
3. XML
(extensible markup language)
인터넷 웹페이지를 만드는 HTML을 획기적으로 개선하여 만든 언어.
1996년 W3C(World Wide Web Consortium)에서 제안하였다.
서로 다른 기종간의 데이터 교환을 위해 등장
HTML보다 강화된 태그로 표현
인코딩 방식은 utf-8
4. JSON
(JavaScript Object Notaio)
속성, 값으로 데이터 표현
경량 데이터 표현, 많은 양의 데이터 표현에 유리
JSON 예제
{"employees":[
{ "firstName":"John", "lastName":"Doe" },
{ "firstName":"Anna", "lastName":"Smith" },
{ "firstName":"Peter", "lastName":"Jones" }
]}
XML 예제
<employees>
<employee>
<firstName>John</firstName> <lastName>Doe</lastName>
</employee>
<employee>
<firstName>Anna</firstName> <lastName>Smith</lastName>
</employee>
<employee>
<firstName>Peter</firstName> <lastName>Jones</lastName>
</employee>
</employees>
XML 문서는 XML DOM(Document Object Model)을 이용하여 해당 문서에 접근한다. JSON은 문자열을 전송받은 후에 해당 문자열을 바로 파싱하므로, XML보다 더욱 빠른 처리 속도를 보여준다
따라서 HTML과 자바스크립트가 연동되어 빠른 응답이 필요한 웹 환경에서 많이 사용된다
JSON은 전송받은 데이터의 무결성을 사용자가 직접 검증해야한다
데이터의 검증이 필요한 곳에서는 스키마를 사용하여 데이터의 무결성을 검증할 수 있는 XML이 아직도 사용된다.
사용하기 쉽다
적은 메모리 공간을 사용하기 때문에 빠르다
맵핑을 생성하지 않아도된다
종속성
- JSON을 처리하기 위해 다른 라이브러리가 필요하지 않다
XML 태그는 미리 정의되어 있지 않다. 사용자 정의 태그를 정의해야한다
사람이 이해하기 쉽다
구조화 된 형식은 프로그램에서 읽고 쓰기가 쉽다
XML은 HTML과 같은 확장 가능한 마크업 언어이다
데이터를 전달하도록 설계 되어있고 데이터를 표시할 수 없다
모든 브라우저에 대한 지원 제공
생성, 조작, 읽기 , 쓰기가 쉽다
구문이 간단
javascript에서 기본적으로 인식되고 javascript 함수인 eval() 로 구문 분석이 가능하다
직렬화가 가능하다
JavaScript 의 모든 객체를 JSON으로 변환하여 JSON을 서버로 보낼 수 있는 텍스트이다
시스템 및 애플리케이션간에 문서 전송이 가능하다.
서로 다른 플랫폼 간에 데이터 교환이 가능하다
HTML에서 데이터를 분리한다
플랫폼 변경 프로세스를 단순화한다
네임 스페이스 지원이 없다. ( 확장성이 부족)
형식적인 문법 정의 지원( 문법을 지켜야한다)
제한된 개발 도구 지원
처리 응용 프로그램이 필요하다
내장 데이터 유형 지원이 없다
XML 구문이 중복된다
사용자가 자신의 태그를 생성하는 것을 허용하지 않는다
텍스트 기반 데이터 전송 형식과 유사하다
API Sheet
API 명세서란 뭘까? 레스토랑에 가서 주문한다고 가정해보자. 종업원에게 메뉴판을 받아 메뉴를 고를 것이다. 메뉴판에는 사장님이 정한 규칙 하에 여러 메뉴들이 있다. 이 메뉴판을 API 명세서
에, 메뉴를 API에 비유해보면 이해하기 수월하다.
단순히 여러 API를 나열하기 위해서 API 명세서를 작성하는 것이 아니다. 그 속에는 나름대로의 규칙이 있으며 궁극적으로 API 명세서를 통해 클라이언트와 서버가 소통할 수 있다.
path variable과 Query Parameter
이 글은 When Should You Use Path Variable and Query Parameter?란 영문글을 한글로 요약 정리한 것입니다. 자세한 내용은 원문을 참고해 주세요.
웹에서 특정 데이터를 전송하고 받기 위해서는 어디(End-point)에 요청할 것인가는 중요한 문제이다. 우리는 데이터를 전송하기 위해 GET, 전송 받기 위해 POST 방식을 쓰는데 이 때 각각의 경로(End-point)를 어떻게 정하는 것이 좋을까.
이에 대한 아이디어는 REST API라는 개념을 통해서 알 수 있다. 하지만 그 이전에 중요하게 알아둬야 할 개념이 Path Variable과 Query Parameter이다. 이 각각의 개념은 무엇이고, 어떤 경우에 써야 되는 것일까 알아보자.
/users?id=123 # Fetch a user who has id of 123
위에서 보는 것처럼 ? 뒤에 id란 변수에 값을 담아 백엔드에 전달하는 방식이 Query string이다. users에 담긴 정보 중 id 123번의 자료를 달라는 요청이다.
/users/123 # Fetch a user who has id 123
위와 동일한 요청을 경로를 지정하여 요청할 수도 있는데 이것을 Path Variable이라고 한다.
일반적으로 우리가 어떤 자원(데이터)의 위치를 특정해서 보여줘야 할 경우 Path variable을 쓰고, 정렬하거나 필터해서 보여줘야 할 경우에 Query parameter를 쓴다. 아래가 바로 그렇게 적용한 사례이다.
/users # Fetch a list of users
/users?occupation=programer # Fetch a list of programer user
/users/123 # Fetch a user who has id 123
위의 방식으로 우리는 어디에 어떤 데이터(명사)를 요청하는 것인지 명확하게 정의할 수 있다. 하지만, 그 데이터를 가지고 뭘 하자는 것인지 동사는 빠져있다. 그 동사 역할을 하는 것이 GET, POST, PUT, DELETE 메소드이다.
즉, Query string과 Path variable이 이들 메소드와 결합함으로써 "특정 데이터"에 대한 CRUD 프로세스를 추가의 엔드포인트 없이 완결 지울 수 있게 되는 것인다.(가령, users/create
혹은 users?action=create
를 굳이 명시해 줄 필요가 없다.)
/users [GET] # Fetch a list of users
/users [POST] # Create new user
/users/123 [PUT] # Update user
/users/123 [DELETE] # remove user
물론 위와 같은 규칙을 지키지 않더라도 잘 돌아가는 API를 만들 수 있다. 하지만 지키지 않을 경우 서비스 엔드포인트는 복잡해 지고, 개발자간/외부와 커뮤니케이션 코스트가 높아져 큰 잠재적 손실을 초래할 수 있으니 이 규칙은 잘 지켜서 사용하는 것이 필수라 하겠다.
장고는 HTTP request 안에 request.GET 그리고 request.POST 객체로 쿼리 딕셔너리를 가져올 수 있다.
[views.py]
class CategoryView(View):
def get(self, request):
category = request.GET.get('category_id', None)
View 클래스에서 위와 같이 작성하면 category_id란 값을 가져올 수 있다.
테스트를 위해 httpie에서 http -v url category_id==4
를 입력하면, 장고의 request.GET에서는 <QueryDict: {'category_id': 4}
가 들어가게 되고, request 헤더에 엔드포인트 url로 /product?category=4
가 찍히게 된다.
만약 테스트를 포스트맨을 통해서 한다면, 파라미터 탭에 키와 밸류를 넣어주면 됩니다.
[views.py]
class ProductView(View):
def get(self, request, product_id):
product = Product.objects.filter(id=product_id).values()
[urls.py]
urlpatterns = [
path('product/<int:product_id>', ProductView.as_view())
]
Path variable는 뷰클래스 함수에서 self, request 외에 별도의 인자를 가지게 되고, 그 인자값이 엔드포인트가 된다. 따라서 path variable은 인자값이 확실하게 부여가 되는 경우(특정 상품의 정보 등)에 주로 사용되며, urls파일에 반드시 반영을 해 줘야 된다.
테스트를 할 때는 간단하게 url에 해당되는 path variable을 추가해 주면 된다. httpie에서는 http -v url/product/4
로 하면 된다.
출처:
http://blog.wishket.com/api란-쉽게-설명-그린클라이언트/
http://blog.wishket.com/soap-api-vs-rest-api-두-방식의-가장-큰-차이점은/
https://velog.io/@pear/Query-String-쿼리스트링이란
https://free-eunb.tistory.com/41
https://stack07142.tistory.com/11
https://velog.io/@jcinsh/Query-string-path-variable