/users?id=123
์์์ ๋ณด๋ ๊ฒ์ฒ๋ผ ? ๋ค์ id๋ ๋ณ์์ ๊ฐ์ ๋ด์ ๋ฐฑ์๋์ ์ ๋ฌํ๋ ๋ฐฉ์์ด Query string์ด๋ค. users์ ๋ด๊ธด ์ ๋ณด ์ค id 123๋ฒ์ ์๋ฃ๋ฅผ ๋ฌ๋ผ๋ ์์ฒญ์ด๋ค.
/users/123
์์ ๋์ผํ ์์ฒญ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ์์ฒญํ ์๋ ์๋๋ฐ ์ด๊ฒ์ Path Variable์ด๋ผ๊ณ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์์(๋ฐ์ดํฐ)์ ์์น๋ฅผ ํน์ ํด์ ๋ณด์ฌ์ค์ผ ํ ๊ฒฝ์ฐ Path variable์ ์ฐ๊ณ , ์ ๋ ฌํ๊ฑฐ๋ ํํฐํด์ ๋ณด์ฌ์ค์ผ ํ ๊ฒฝ์ฐ์ Query parameter๋ฅผ ์ด๋ค. ์๋๊ฐ ๋ฐ๋ก ๊ทธ๋ ๊ฒ ์ ์ฉํ ์ฌ๋ก์ด๋ค.
์์ ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ๋ ์ด๋์ ์ด๋ค ๋ฐ์ดํฐ(๋ช ์ฌ)๋ฅผ ์์ฒญํ๋ ๊ฒ์ธ์ง ๋ช ํํ๊ฒ ์ ์ํ ์ ์๋ค. ํ์ง๋ง, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ญ ํ์๋ ๊ฒ์ธ์ง ๋์ฌ๋ ๋น ์ ธ์๋ค. ๊ทธ ๋์ฌ ์ญํ ์ ํ๋ ๊ฒ์ด 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
[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๋ก ํ๋ฉด ๋๋ค.
๐ GET ๋ฉ์๋
ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ URL์ ๋ถ์ฌ์ ๋ณด๋ธ๋ค. ์์์ ์๋ฅผ ๋ค์๋ ๊ฒ ์ฒ๋ผ ์์ด๋์ ํจ์ค์๋๋ฅผ ๋ณด๋๋ค๊ณ ์๊ฐํ๋ฉด
www.velog.com?id=velog&pass=1234
์ด๋ ๊ฒ ๋ณด๋ด๊ฒ๋๋ค. URL๋ค์ ? ๋งํฌ๋ฅผ ํตํด URL์ ๋์ ์๋ฆฌ๋ฉด์ ๋ฐ์ดํฐ ํํ์ ์์์ ์ ์๋ฆฐ๋ค. ๋ฐ์ดํฐ๋ key์ value ์์ผ๋ก ๋ฃ์ด์ผํ๋ค. ์ ์์๋ก ๋ณด๋ฉด key๋ id์ pass ์ด๊ณ , value๋ velog์ 1234 ์ด๋ค. ์ค๊ฐ & ๋ ๊ตฌ๋ถ์์ด๋ค. 2๊ฐ ์ด์์ key-value ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ & ๋งํฌ๋ก ๊ตฌ๋ถํ๊ฒ๋๋ค.
URL์ ๋ถ์ด๋ฏ๋ก ๐HTTP ํจํท์ ํค๋์ ํฌํจ๋์ด ์๋ฒ์ ์์ฒญ๐์ ๋ณด๋ด๊ฒ๋๋ค. ๊ทธ๋์ ๐GET ๋ฉ์๋๋ก ์์ฒญ์ ๋ณด๋ผ๋๋ HTTPํจํท์ BODY๊ฐ ๋น ์ํ๐๋ก ๋ณด๋ด์ง๊ฒ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ํค๋์ ๋ด์ฉ ์ค BODY๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ๋ Content-Type ์ด๋ผ๋ ํค๋ํ๋๋ ๋ค์ด๊ฐ์ง ์๋๋ค.
URL ํํ๋ก ํํ๋๋ฏ๋ก, ํน์ ํ์ด์ง๋ฅผ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ ์ํ๊ฒ ํ ์ ์๊ณ , ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ก ์ค๊ณ๋์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ์์ ํ๊ณ๊ฐ ์กด์ฌํ๋ค.
๐ POST ๋ฉ์๋
POST ๋ฐฉ์์ GET๋ฐฉ์๊ฐ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ ์ ์ก์ ๊ธฐ๋ฐ์ผ๋ก ํ ์์ฒญ ๋ฉ์๋์ด๋ค. GET ๋ฐฉ์์ URL์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌ์ ๋ณด๋ด๋ ๋ฐ๋ฉด, POST ๋ฐฉ์์ URL์ด ์๋๋ผ BODY์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ๋ณด๋ด๊ฒ๋๋ค. ๋ฐ๋ผ์ ํค๋ํ๋์ค BODY์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช
ํ๋ Content-Type ์ด๋ผ๋ ํค๋ํ๋๊ฐ ๋ค์ด๊ฐ๊ณ ์ด๋ค ๋ฐ์ดํฐ ํ์
์ธ์ง ๋ช
์ํด์ผํ๋ค.
Content-Type ์ผ๋ก๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง ๋ํ์ ์ผ๋ก
1. application/x-www-form-urlencoded
2. text/plain
3. multipart/form-data
๋ฑ์ด ์๋ค.
๋ฐ๋ผ์ POST ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ๋๋ ์์ ๊ฐ์ด Content-Type ์ ๊ผญ ๋ช
์ํด์ค์ผํ๋ค.
๋ณดํต ์์ฑํ์ง ์์ผ๋ฉด 1๋ฒ์ผ๋ก ์
ํ
๋๋๋ฐ, GET ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก BODY์ key-value ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค. ๊ตฌ๋ถ์๋ ๋๊ฐ์ด &์ด๋ค.
2๋ฒ์ BODY์ ๋จ์ txt๋ฅผ ๋ฃ๋๋ค.
3๋ฒ์ ํ์ผ์ ์ก ํ ๋ ๋ง์ด ์ฐ๋๋ฐ, BODY์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ก ๋ฃ๋๋ค๋ ๊ฑธ ์๋ ค์ค๋ค.
request.GET vs request.GET.get()
request.GET์ GET์ผ๋ก ๋ฐ๋ ํ๋ผ๋ฏธํฐ๋ค์ ๋ค ํฌํจํ๋ ๋์ ๋๋ฆฌ ๊ฐ์ฒด์ด๋ค.
get() ๋ฉ์๋๋ key ๊ฐ์ด ๋์ ๋๋ฆฌ ์์์์ผ๋ฉด value๊ฐ์ ๋ฆฌํดํด์ค๋ค. ํค ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋ํดํธ๊ฐ์ธ None์ ๋ฆฌํดํ๋ค.
request.GET.get()์ ์ ๋ ๊ฐ๋ ์ ํฉ์น๊ฒ์ผ๋ก GET ์์ฒญ์ด ์ ๊ทผํ ์ ์๋ key์ value ๊ฐ์ ์ด์ฉํ๋ค.
๐ฅ
GET - ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ์์ฒญ์ด ์์ ์ ์ฒ๋ฆฌ๋ฐฉ๋ฒ
๋ฐฑ์๋์์ ๋ฐ๋ ๋ฐฉ๋ฒ์?
์๋ฅผ ๋ค์ด์
http://localhost:8000/example?sort_by=price-ascending
๋ผ๋ ํ์์ ์ฃผ์๊ฐ ์๋ค๋ฉด, key๊ฐ์ด sort_by์ด๋ฉฐ value๊ฐ์ price-ascending ๋ฅผ ๋ฃ์ด์ example ์ด๋ผ๋ ์๋ํฌ์ธํธ์ ์์ฒญ์ ๋ณด๋ธ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ฅ๊ณ ๊ธฐ๋ฅ์ผ๋ก ์ธํด query parameter์ key์ value๋ request์ GET ๊ฐ์ฒด๋ก ์ฟผ๋ฆฌ ๋์ ๋๋ฆฌ๋ก ๋ด๊ฒจ์ ๋ค์ด์จ๋ค๋ ์ ์ด๋ค.
#views.py
class ExamView(View):
def get(self, request):
sort_by = request.GET.get('sort_by', None)
data = Exam.objects.get(sort=sort_by)
return JsonResponse(...)
๊ทธ๋ฌ๋ฏ๋ก ์์๊ฐ์ด request์ GET๊ฐ์ฒด์์ get๋ฉ์๋๋ฅผ ์ด์ฉํด์ key ๊ฐ์ธ sort_by์ ํด๋นํ๋ value๋ฅผ ๊ฐ๊ณ ์ค๋ฉด ๋๋ค. ์์ผ๋ฉด None์ ๊ฐ๊ณ ์์ ์๋ฌ๋ฅผ ์ค์ฌ์ฃผ์.
๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์์ ๊ฐ๊ณตํด์ค ๋ค ๋ฐํํด์ฃผ๋ฉด ๋๋ค.
๐ฅ
GET - Path parameter (url parameter)
์์ฒญ์ด ์ฟผ๋ฆฌ์คํธ๋ง์ด ์๋๋ผ Path parameter(url parameter)๋ก ๋ค์ด์ฌ์๋ ์๋ค.
๋ฐฑ์๋์์ ํน์ endpoint๋ฅผ ์ง์ ํ์ง ์๊ณ , ํ๋ก ํธ์๋๊ฐ ๋ณด๋ด๋ ํน์ string์ด๋ int๋ฅผ path์์ parameter๋ก ๋ฐ์ view๋ก ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค.
urlpatterns = [
path('/<str:target_code>', AreaView.as_view())
]
๋น์ฐํ ์์ ์ฒ๋ผ urls ํ์ผ์๋ ๋ฐ์ํด์ค์ผํ๋ค.
class AreaView(View):
def get(self, request, target_code=''):
view ํด๋์ค ํจ์์์ self์ request์ธ์ ๋ค๋ฅธ ์ธ์๋ฅผ ๊ฐ๊ฒ๋๋ฉฐ ์ฒ๋ฆฌํด์ค์ผํ๋ค. ๊ทธ ์ธ์๊ฐ์ด endpoint๊ฐ ๋๋ค.
url parameter๋ ์ธ์๊ฐ ์์ผ๋ฉด ์๋๊ณ , ์ธ์๊ฐ์ผ๋ก ํ์คํ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ๊ทธ์ ๋ฐํด query parameter๋ ์ฌ๋ฌ๊ฐ์ ์กฐ๊ฑด์ด ๊ฒฐํฉ๋ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๐ฅ
POST - JSON ์ผ๋ก ์์ฒญ์ด ์์ ์ ์ฒ๋ฆฌ๋ฐฉ๋ฒ
์ด๋ฒ์๋ POST ๋ฉ์๋๋ก ์์ฒญ์ด ์์ ์์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์์๋ณด์.
์์์๋ ์์๋ดค์ง๋ง ๋ณดํต POST ๋ฉ์๋๋ HTTP์ BODY์ ๋ด์ฉ์ ๋ด์์ ์์ฒญ(request)์ ๋ณด๋ธ๋ค.
์๋์ ๊ฐ์ด ํ๋ก ํธ์๋์์ ๋ฐ๋์ json ๊ฐ์ฒด ํํ๋ก ์์ฒญ(request)๋ฅผ ๋ณด๋ด๊ฒ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ํ๋ก ํธ์ ๋ฐฑ์๋๊ฐ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ค์์ผ๋ก ๋ณด๋ด๊ณ ์ด๋ค ์์ผ๋ก ๋ฐ์์ง ์ ์ํตํด์ผ๋๋ค๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด๋ก ๋ณด๋ผ์ง, ๋ฆฌ์คํธ๋ก ๋ณด๋ผ ์ง, ํค ๊ฐ์ ์ด๋ป๊ฒ ๋ณด๋ผ์ง ๋ฑ ์ํต์ด ๊ต์ฅํ ์ค์ํ๋ค.
{
"user_id": "test1",
"password": "qwer1234!",
"name": "test",
"birth_date": "2020-05-01",
"phone": "010-0000-0000",
"email": "test@naver.com"
}
์์๊ฐ์ด json ํ์์ผ๋ก ์์ฒญ์ด ๋ค์ด์๋ค๊ณ ์๊ฐํ๊ณ ์งํํ ๊ฒ์ด๋ค.
๐ฅ
json ํ์?
JSON ํ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก key:value ๊ฐ ์กด์ฌํ ์ ์์, key๊ฐ์ด ๋ฌธ์์ด์ด๋ฉด ํญ์ ์๋ฐ์ดํ๋ฅผ ์ด์ฉํ์ฌ ํ๊ธฐํด์ผํ๋ค.
๊ฐ์ฒด๋ ๋ฐฐ์ด ๋ฑ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ({key:value} / [30,40])
๋ํ null, number, string, array, object, boolean ์ ์ฌ์ฉํ ์ ์๋ค.
๋ฐฑ์๋๋ ๊ทธ๋ผ ์ json ํ์์ request๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ ๊น?
#views.py
data = json.loads(request.body)
์ ์ฝ๋์ ์๋ฏธ๋ request์ ๋ฐ๋์ ๋ด๊ฒจ์ ์ค๋ ๋ด์ฉ์ด json ํ์์ด๋ฉด, json ํ์์ string์ python dictionary ํ์์ผ๋ก ๋ณ๊ฒฝํด์ data๋ผ๋ ๋ณ์์ ์ ์ฅํด์ค ๋ผ๋ ์๋ฏธ์ด๋ค.
data = json.loads(request.body)
if len(data.keys()) < 6:
return HttpResponse(status=400)
for value in data.values():
if value in "":
return HttpResponse(status=400)
์ ์ฝ๋๋ ๊ทธ๋ฃนํ๋ก์ ํธ ์ค์ ํ์๊ฐ์
์ฝ๋์ ์ผ๋ถ๋ถ์ด๋ค.
๋ณ์์ ์ ์ฅํ ๋ค data์ key ์๊ฐ 6๊ฐ ์ดํ๋ฉด ์๋ฌ์ฝ๋๋ฅผ, ๊ทธ๋ฆฌ๊ณ value์ ๋น๊ฐ์ด ๋ค์ด์๋ค๋ฉด ์๋ฌ์ฝ๋๋ฅผ ๋ณด๋ด์ค๋ค๋ ์๋ฏธ์ด๋ค.
ํ์๊ฐ์
์ ํ์์ฌํญ์ด 6๊ฐ์ด๊ธฐ์ ํน์๋ผ๋ ๊ทธ ์ดํ์ ๊ฐ์ด ๋ค์ด์ค๊ฑฐ๋, ์์ ์๋ฌด๋ฐ ๊ฐ๋ ๋ฃ์ง ์์์ ๋ ์๋ฌ์ฝ๋๋ฅผ ๋ฐํํ๋ค๋ ์๋ฏธ์ด๋ค.
๐ฅ
์ฐธ๊ณ : https://velog.io/@jcinsh/Query-string-path-variable
๐ฅ
์ฐธ๊ณ : https://velog.io/@magnoliarfsit/ReDjango-3.-GET-POST-๋ฉ์๋-์ฐจ์ด์ -๋ฐ-api-์ค๊ณ