query parameter vs path parameter ๐ŸคŽ

On a regular basisยท2021๋…„ 8์›” 5์ผ
0
post-thumbnail

โšฝ๏ธ Path Vaiable & Query Parameter

1) Query string

/users?id=123
์œ„์—์„œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ? ๋’ค์— id๋ž€ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋‹ด์•„ ๋ฐฑ์—”๋“œ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด Query string์ด๋‹ค. users์— ๋‹ด๊ธด ์ •๋ณด ์ค‘ id 123๋ฒˆ์˜ ์ž๋ฃŒ๋ฅผ ๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ด๋‹ค.

2) Path Variable

/users/123
์œ„์™€ ๋™์ผํ•œ ์š”์ฒญ์„ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์„ Path Variable์ด๋ผ๊ณ  ํ•œ๋‹ค.

3) Query string๊ณผ 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

โšฝ๏ธ Code & Test

1) Query string

[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๊ฐ€ ์ฐํžˆ๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ ํ…Œ์ŠคํŠธ๋ฅผ ํฌ์ŠคํŠธ๋งจ์„ ํ†ตํ•ด์„œ ํ•œ๋‹ค๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ ํƒญ์— ํ‚ค์™€ ๋ฐธ๋ฅ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

2) Path variable

[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๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

โšฝ๏ธ CONFUNDIDO ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ณณ!!

1) ํ—ท๊ฐˆ๋ฆฐ ๋ถ€๋ถ„1

๐Ÿ€ 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์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ๋„ฃ๋Š”๋‹ค๋Š” ๊ฑธ ์•Œ๋ ค์ค€๋‹ค.

2) ํ—ท๊ฐˆ๋ฆฐ ๋ถ€๋ถ„2

request.GET vs request.GET.get()
request.GET์€ GET์œผ๋กœ ๋ฐ›๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋‹ค ํฌํ•จํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ์ฒด์ด๋‹ค.
get() ๋ฉ”์„œ๋“œ๋Š” key ๊ฐ’์ด ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์—์žˆ์œผ๋ฉด value๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. ํ‚ค ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋””ํดํŠธ๊ฐ’์ธ None์„ ๋ฆฌํ„ดํ•œ๋‹ค.
request.GET.get()์€ ์œ„ ๋‘ ๊ฐœ๋…์„ ํ•ฉ์นœ๊ฒƒ์œผ๋กœ GET ์š”์ฒญ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” key์™€ value ๊ฐ’์„ ์ด์šฉํ•œ๋‹ค.

3) ํ—ท๊ฐˆ๋ฆฐ ๋ถ€๋ถ„3

๐Ÿฅ… 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-์„ค๊ณ„

profile
๊ฐœ๋ฐœ ๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€