{"id":236,"date":"2026-05-15T05:48:38","date_gmt":"2026-05-14T21:48:38","guid":{"rendered":"https:\/\/junai.ai\/blog\/python-requests-20\/"},"modified":"2026-05-17T07:31:27","modified_gmt":"2026-05-16T23:31:27","slug":"python-requests-20","status":"publish","type":"post","link":"https:\/\/junai.ai\/blog\/python-requests-20\/","title":{"rendered":"\ud30c\uc774\uc36c requests \uc0ac\uc6a9\ubc95 \u2014 GET\u00b7POST\u00b7JSON (20\ud3b8)"},"content":{"rendered":"\n<!-- WordPress REST API \ubc1c\ud589\uc6a9 HTML (\uc790\ub3d9 \uc0dd\uc131) -->\n<!-- WP-FEATURED-MEDIA-ID: 599 -->\n<div style=\"max-width:800px;margin:0 auto;\">\n<style>\n\/* js-textbook \u2014 PostgreSQL \uad50\uc7ac \ub3d9\uc77c \ud314\ub808\ud2b8 *\/\n:root {\n  --color-primary: #336791;\n  --color-accent: #60a5fa;\n  --color-bg: #fafafa;\n  --color-bg-card: #ffffff;\n  --color-text: #1e293b;\n  --color-text-muted: #64748b;\n  --hero-start: #0f172a;\n  --hero-end: #336791;\n  --font-body: -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif;\n  --size-body: 17px;\n  --line-height: 1.75;\n}\n* { box-sizing: border-box; }\n.container { max-width: 760px; margin: 0 auto; padding: 0 22px 80px; }\n.hero { background: linear-gradient(135deg, var(--hero-start) 0%, var(--hero-end) 100%); color: #fff; padding: 72px 22px 56px; text-align: center; }\n.hero .badge { display: inline-block; background: rgba(96,165,250,0.18); color: var(--color-accent); padding: 6px 14px; border-radius: 999px; font-size: 13px; font-weight: 600; letter-spacing: 0.5px; margin-bottom: 18px; }\n.hero h1 { margin: 0 0 18px; font-size: 36px; line-height: 1.3; letter-spacing: -0.3px; }\n.hero p.sub { margin: 0 auto; max-width: 580px; font-size: 17px; color: #bfdbfe; }\n.hero img { width: 100%; max-width: 720px; height: auto; margin: 36px auto 0; display: block; border-radius: 10px; box-shadow: 0 8px 32px rgba(0,0,0,0.3); }\n.meta { display: flex; gap: 14px; justify-content: center; margin-top: 20px; font-size: 13px; color: #93c5fd; flex-wrap: wrap; }\n.meta span::before { content: \"\u00b7\"; margin-right: 14px; color: #1e3a8a; }\n.meta span:first-child::before { content: \"\"; margin: 0; }\narticle { background: var(--color-bg-card); margin-top: -36px; padding: 44px 28px; border-radius: 14px; box-shadow: 0 2px 18px rgba(0,0,0,0.06); }\narticle p { margin: 0 0 18px; }\nh2 { font-size: 28px; line-height: 1.35; letter-spacing: -0.3px; margin: 48px 0 18px; padding-bottom: 10px; border-bottom: 2px solid var(--color-primary); }\nh2:first-of-type { margin-top: 8px; }\nh3 { font-size: 21px; line-height: 1.4; margin: 30px 0 12px; color: var(--color-primary); }\ncode { background: #f1f5f9; color: #0f172a; padding: 2px 6px; border-radius: 4px; font-family: 'SFMono-Regular', Menlo, Consolas, monospace; font-size: 0.92em; }\npre { background: #0f172a; color: #e2e8f0; padding: 18px 20px; border-radius: 10px; overflow-x: auto; font-size: 14.5px; line-height: 1.65; margin: 18px 0; }\npre code { background: transparent; color: inherit; padding: 0; }\nul, ol { margin: 0 0 18px; padding-left: 24px; }\nli { margin-bottom: 8px; }\nstrong { color: #0f172a; }\n.databox { background: #eff6ff; border-left: 4px solid var(--color-primary); padding: 18px 20px; border-radius: 6px; margin: 22px 0; }\n.databox p { margin: 0 0 8px; }\n.databox p:last-child { margin: 0; }\n.databox strong { color: var(--color-primary); }\n.warnbox { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); border-left: 4px solid #d97706; padding: 18px 20px; border-radius: 6px; margin: 22px 0; }\n.warnbox strong { color: #92400e; }\n.tablewrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 22px 0; }\ntable { width: 100%; border-collapse: collapse; font-size: 15px; background: var(--color-bg-card); }\nth, td { padding: 11px 12px; text-align: left; border-bottom: 1px solid #e2e8f0; vertical-align: top; }\nth { background: #f1f5f9; font-weight: 700; color: #0f172a; }\ntd:first-child, th:first-child { font-weight: 700; }\n.cta { background: linear-gradient(135deg, #336791 0%, #60a5fa 100%); color: #fff; padding: 30px 24px; border-radius: 12px; margin-top: 44px; text-align: center; }\n.cta h3 { color: #fff; margin: 0 0 10px; }\n.cta p { margin: 0; color: #dbeafe; }\n.series-nav { background: #eff6ff; padding: 18px 22px; border-radius: 10px; margin-top: 24px; font-size: 14.5px; color: var(--color-text-muted); }\n.series-nav strong { color: var(--color-primary); }\n@media (max-width: 480px) {\n  .hero { padding: 52px 18px 44px; }\n  .hero h1 { font-size: 26px; }\n  .hero p.sub { font-size: 15px; }\n  article { padding: 28px 18px; border-radius: 10px; }\n  h2 { font-size: 22px; }\n  h3 { font-size: 18px; }\npre { font-size: 13px; padding: 14px 16px; }\n}\n@media (max-width: 560px) {\n  .tablewrap table, .tablewrap thead, .tablewrap tbody, .tablewrap tr, .tablewrap th, .tablewrap td { display: block; width: auto; }\n  .tablewrap thead { display: none; }\n  .tablewrap tr { margin: 0 0 14px; border: 1px solid #e2e8f0; border-radius: 10px; overflow: hidden; }\n  .tablewrap td { border: none; border-bottom: 1px solid #f1f5f9; padding: 9px 14px; }\n  .tablewrap td:first-child { background: #eff6ff; font-weight: 800; font-size: 15.5px; }\n  .tablewrap td:last-child { border-bottom: none; }\n  .tablewrap td[data-label]::before { content: attr(data-label) \" \u2014 \"; font-weight: 700; color: var(--color-primary); }\n}\n<\/style>\n<header class=\"hero\">\n  <span class=\"badge\">\ud30c\uc774\uc36c \uad50\uc7ac \u00b7 20\ud3b8 \/ 27\ud3b8<\/span>\n  <h1>\ud30c\uc774\uc36c requests \uc0ac\uc6a9\ubc95<\/h1>\n  <p class=\"sub\">\uc678\ubd80 \ud328\ud0a4\uc9c0 \uccab \uc815\uc2dd. \ud55c \uc904\ub85c API \ud638\ucd9c, \ub450 \uc904\ub85c JSON \ud30c\uc2f1.<\/p>\n  <div class=\"meta\"><span>\uc911\uae09<\/span><span>\uc77d\ub294 \uc2dc\uac04 7\ubd84<\/span><span>2026-05-13<\/span><\/div>\n  <img decoding=\"async\" src=\"https:\/\/junai.ai\/blog\/wp-content\/uploads\/2026\/05\/hero-218.jpg\" alt=\"requests.get GitHub API \ud638\ucd9c\uacfc \uc751\ub2f5 \ud30c\uc2f1 \ucf54\ub4dc \ud654\uba74\">\n<\/header>\n\n<div class=\"container\">\n<article>\n\n<p>\ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\ub3c4 <code>urllib<\/code> \uc73c\ub85c HTTP \ud638\ucd9c\uc774 \uac00\ub2a5\ud558\uc9c0\ub9cc \ubaa8\ub4e0 \uc785\ubb38\uc11c\u00b7\ud29c\ud1a0\ub9ac\uc5bc\u00b7\uc2e4\ubb34 \ucf54\ub4dc\uac00 <strong><code>requests<\/code><\/strong> \ub97c \uc501\ub2c8\ub2e4. \uc0ac\uc6a9\uc131 \ucc28\uc774\uac00 \ub108\ubb34 \ucee4\uc11c\uc694. <code>urllib<\/code> \uc73c\ub85c 8\uc904 \uc9dc\uc57c \ud560 \ud638\ucd9c\uc774 <code>requests<\/code> \ub85c\ub294 1-2\uc904. 1991\ub144 \uc774\ub798 \uac00\uc7a5 \ub2e4\uc6b4\ub85c\ub4dc\ub41c \ud30c\uc774\uc36c \ud328\ud0a4\uc9c0\uc774\uace0, \uccab \uc678\ubd80 \ud328\ud0a4\uc9c0 \ud559\uc2b5\uc740 \uac70\uc758 \ud56d\uc0c1 \uc774\uac70.<\/p>\n\n<p>20\ud3b8\uc744 \ub9c8\uce58\uba74 \u2460 GET\u00b7POST \uae30\ubcf8 \u2461 \ucffc\ub9ac \ud30c\ub77c\ubbf8\ud130\u00b7\ud5e4\ub354 \u2462 JSON \uc1a1\uc218\uc2e0 \u2463 \ud0c0\uc784\uc544\uc6c3\u00b7\uc5d0\ub7ec \ucc98\ub9ac \u2464 Session\u00b7\uc778\uc99d\u00b7\uc7ac\uc2dc\ub3c4 \u2014 5\uac00\uc9c0\uac00 \uc190\uc5d0 \uc775\uc2b5\ub2c8\ub2e4.<\/p>\n\n<h2>\uc124\uce58\uc640 \uccab \ud638\ucd9c<\/h2>\n\n<pre><code># venv \ud65c\uc131\ud654 \uc0c1\ud0dc\uc5d0\uc11c\n(.venv) $ pip install requests\n\nimport requests\n\nr = requests.get(\"https:\/\/api.github.com\")\nr.status_code      # 200\nr.headers[\"content-type\"]   # 'application\/json; charset=utf-8'\nr.text             # '{\"current_user_url\":\"https:\/\/api.github.com\/user\", ...}'\nr.json()           # \ud30c\uc2f1\ub41c dict<\/code><\/pre>\n\n<p><code>requests.get(URL)<\/code> \ud55c \uc904\uc774 \ub05d. \uacb0\uacfc\uc778 <strong>Response \uac1d\uccb4<\/strong>\uc5d0\uc11c \uc0c1\ud0dc \ucf54\ub4dc(<code>.status_code<\/code>), \ubcf8\ubb38 \ud14d\uc2a4\ud2b8(<code>.text<\/code>), JSON \ud30c\uc2f1(<code>.json()<\/code>), \ud5e4\ub354(<code>.headers<\/code>)\ub97c \uaebc\ub0c5\ub2c8\ub2e4.<\/p>\n\n<h2>\ucffc\ub9ac \ud30c\ub77c\ubbf8\ud130\u00b7\ud5e4\ub354 \u2014 params\u00b7headers<\/h2>\n\n<pre><code># \u274c \uc9c1\uc811 \ubb38\uc790\uc5f4 \ud569\uce58\uae30 \u2014 \uc778\ucf54\ub529 \ud568\uc815\u00b7\uc77d\uae30 \uc5b4\ub824\uc6c0\nurl = \"https:\/\/api.example.com\/search?q=python&amp;page=2\"\n\n# \u2705 params \ub515\uc154\ub108\ub9ac\ub85c\nr = requests.get(\"https:\/\/api.example.com\/search\",\n                 params={\"q\": \"python\", \"page\": 2, \"limit\": 50})\nr.url            # \uc790\ub3d9 \uc778\ucf54\ub529\ub41c \ucd5c\uc885 URL\n\n# \ud5e4\ub354 \ucd94\uac00 \u2014 User-Agent\u00b7Authorization \ub4f1\nr = requests.get(\"https:\/\/api.github.com\/user\",\n                 headers={\n                     \"Authorization\": \"Bearer ghp_xxxxx\",\n                     \"Accept\": \"application\/vnd.github+json\",\n                 })<\/code><\/pre>\n\n<p><code>params<\/code> \uc758 \uac12\uc740 \uc790\ub3d9\uc73c\ub85c URL \uc778\ucf54\ub529\ub429\ub2c8\ub2e4. \ud55c\uae00\u00b7\uacf5\ubc31\u00b7\ud2b9\uc218\ubb38\uc790 \uac71\uc815 \uc5c6\uc774 \uadf8\ub0e5 \uc801\uc73c\uba74 \ub3fc\uc694.<\/p>\n\n<h2>POST\u00b7JSON \uc1a1\uc218\uc2e0<\/h2>\n\n<pre><code># JSON \ubcf8\ubb38\uc73c\ub85c POST\nr = requests.post(\n    \"https:\/\/httpbin.org\/post\",\n    json={\"name\": \"\uc900\uc131\", \"age\": 30},   # json= \uc4f0\uba74 \uc790\ub3d9 \uc9c1\ub82c\ud654 + Content-Type \ud5e4\ub354\n    timeout=10,\n)\ndata = r.json()\nprint(data[\"json\"])    # {'name': '\uc900\uc131', 'age': 30}\n\n# \ud3fc \ub370\uc774\ud130 (application\/x-www-form-urlencoded)\nrequests.post(url, data={\"username\": \"u\", \"password\": \"p\"})\n\n# \ud30c\uc77c \uc5c5\ub85c\ub4dc (multipart)\nwith open(\"photo.jpg\", \"rb\") as f:\n    requests.post(url, files={\"image\": f})<\/code><\/pre>\n\n<p><strong><code>json=<\/code> \uacfc <code>data=<\/code> \uc758 \ucc28\uc774<\/strong>\uac00 \uc785\ubb38\uc790 1\ubc88 \uc2e4\uc218. JSON API \ub77c\uba74 \uac70\uc758 \ud56d\uc0c1 <code>json=<\/code> \u2014 \uc790\ub3d9 \uc9c1\ub82c\ud654 + Content-Type \ud5e4\ub354\uae4c\uc9c0.<\/p>\n\n<h2>\ud0c0\uc784\uc544\uc6c3\u00b7\uc5d0\ub7ec \ucc98\ub9ac \u2014 \uc548\uc804\ud55c \ud638\ucd9c<\/h2>\n\n<div class=\"warnbox\">\n  <strong>\u26a0\ufe0f <code>timeout<\/code> \uc5c6\ub294 requests \ud638\ucd9c\uc740 \uc808\ub300 \uae08\uc9c0.<\/strong> \uae30\ubcf8\uac12\uc774 \ubb34\ud55c \ub300\uae30\ub77c\uc11c \uc678\ubd80 \uc11c\ubc84\uac00 \uba48\ucd94\uba74 \ubcf8\uc778 \uc2a4\ud06c\ub9bd\ud2b8\ub3c4 \ubb34\ud55c \ub300\uae30. \uc790\ub3d9\ud654 \uc2a4\ud06c\ub9bd\ud2b8\uac00 24\uc2dc\uac04 \ub9e4\ub2ec\ub824\uc788\ub294 \uc0ac\uace0\uac00 \ub9e4\uc6b0 \ud754\ud569\ub2c8\ub2e4. <code>timeout=10<\/code> \ud55c \uc904\ub85c \ubc29\uc5b4.\n<\/div>\n\n<pre><code>try:\n    r = requests.get(\"https:\/\/api.example.com\/users\",\n                     timeout=10,\n                     params={\"q\": \"python\"})\n    r.raise_for_status()   # 4xx\u00b75xx \uba74 HTTPError \ubc1c\uc0dd\n    data = r.json()\nexcept requests.Timeout:\n    print(\"\uc751\ub2f5 \uc9c0\uc5f0 \u2014 10\ucd08 \ucd08\uacfc\")\nexcept requests.HTTPError as e:\n    print(f\"HTTP \uc5d0\ub7ec: {e.response.status_code}\")\nexcept requests.RequestException as e:\n    print(f\"\ub124\ud2b8\uc6cc\ud06c \ubb38\uc81c: {e}\")    # \ubd80\ubaa8 \uc608\uc678 \u2014 \ubaa8\ub4e0 requests \uc608\uc678<\/code><\/pre>\n\n<p><code>raise_for_status()<\/code> \ud55c \uc904\uc774 200 \uc678 \uc751\ub2f5\uc744 \uc989\uc2dc \uc608\uc678\ub85c \ubc14\uafc9\ub2c8\ub2e4. 12\ud3b8\uc758 try\/except \uac00 \uc5ec\uae30\uc11c \ube5b\ub0a9\ub2c8\ub2e4.<\/p>\n\n<h2>Session\u00b7\uc778\uc99d\u00b7\uc7ac\uc2dc\ub3c4 + \ub9c8\ubb34\ub9ac<\/h2>\n\n<h3>Session \u2014 \uac19\uc740 \ud638\uc2a4\ud2b8 \uc5ec\ub7ec \ud638\ucd9c<\/h3>\n\n<pre><code>with requests.Session() as s:\n    s.headers.update({\"Authorization\": \"Bearer xxx\"})\n    s.timeout = 10\n\n    r1 = s.get(\"https:\/\/api.github.com\/user\")\n    r2 = s.get(\"https:\/\/api.github.com\/user\/repos\")\n    # \uac19\uc740 TCP \uc5f0\uacb0\uc744 \uc7ac\uc0ac\uc6a9 \u2014 5-10\ubc30 \ube60\ub984<\/code><\/pre>\n\n<p>API \ub97c \uc5ec\ub7ec \ubc88 \ud638\ucd9c\ud560 \uac70\uba74 <code>Session<\/code> \uc73c\ub85c \ubb36\uc73c\uc138\uc694. \ud5e4\ub354\u00b7\uc778\uc99d\u00b7\ucfe0\ud0a4\uac00 \uc790\ub3d9 \uacf5\uc720\ub418\uace0 \uc5f0\uacb0\ub3c4 \uc7ac\uc0ac\uc6a9. \uc9e7\uc740 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \uadf8\ub0e5 <code>requests.get<\/code> \uc73c\ub85c \ucda9\ubd84.<\/p>\n\n<h3>\uc778\uc99d\uc758 4\uac00\uc9c0 \ubc29\uc2dd<\/h3>\n\n<pre><code># 1) Bearer \ud1a0\ud070 (\uac00\uc7a5 \ud754\ud568)\nheaders={\"Authorization\": \"Bearer ghp_xxxxx\"}\n\n# 2) Basic Auth\nrequests.get(url, auth=(\"user\", \"pass\"))\n\n# 3) \ucffc\ub9ac \ud30c\ub77c\ubbf8\ud130 (\uc61b API)\nparams={\"api_key\": \"xxxxx\"}\n\n# 4) \ucee4\uc2a4\ud140 \ud5e4\ub354\nheaders={\"X-API-Key\": \"xxxxx\"}<\/code><\/pre>\n\n<div class=\"databox\">\n  <p><strong>\ud83d\udccc API \ud0a4\ub294 \uc808\ub300 \ucf54\ub4dc\uc5d0 \uc9c1\uc811 \ubc15\uc9c0 \ub9c8\uc138\uc694<\/strong><\/p>\n  <p>\ud658\uacbd \ubcc0\uc218 \ub610\ub294 <code>.env<\/code> \ud30c\uc77c\uc5d0. <code>import os; key = os.environ[\"API_KEY\"]<\/code> \ub610\ub294 <code>python-dotenv<\/code> \ud328\ud0a4\uc9c0. \uae43\uc5d0 \ud0a4\uac00 \uc62c\ub77c\uac00\ub294 \uc0ac\uace0\ub294 \ud55c \uc2dc\uac04 \uc548\uc5d0 GitHub \ubd07\uc774 \ubc1c\uacac\ud574 \uc545\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n\n<p>\ub2e4\uc74c \ubbf8\uc158: \u2460 <code>https:\/\/api.github.com\/users\/&lt;\ubcf8\uc778&gt;<\/code> \ud638\ucd9c\ud574 \ud314\ub85c\uc6cc \uc218 \ucd9c\ub825 \u2461 \ud658\uc728 API(\uc608: exchangerate.host) \ub85c USD\u2192KRW \ubcc0\ud658 \ud568\uc218 \u2462 \uc5d0\ub7ec \ucc98\ub9ac \ub2e4 \ud3ec\ud568\ud55c \ud568\uc218 \ub9cc\ub4e4\uc5b4 timeout\u00b7HTTPError \ucf00\uc774\uc2a4 \uc2dc\ubbac\ub808\uc774\ud2b8.<\/p>\n\n<div class=\"cta\">\n  <h3>\ub2e4\uc74c \ud3b8 \ubbf8\ub9ac\ubcf4\uae30<\/h3>\n  <p>21\ud3b8 \u2014 &#8220;\ud30c\uc774\uc36c pandas \uae30\ucd08&#8221;: \ub370\uc774\ud130 \ubd84\uc11d\uc758 \uc2dc\uc791. DataFrame\u00b7CSV \uc77d\uae30\u00b7\ud544\ud130\u00b7\uadf8\ub8f9\ud654. 5\ud3b8 list \uac00 \uc9c4\ud654\ud55c \ubaa8\uc2b5.<\/p>\n<\/div>\n\n<div class=\"series-nav\">\n  <strong>\ud83d\udcda 27\ud3b8 \ud30c\uc774\uc36c \uad50\uc7ac \uc2dc\ub9ac\uc988 \u2014 20\/27\ud3b8<\/strong><br>\n  \u2190 19\ud3b8 &#8220;collections\u00b7itertools&#8221; \u00b7 \ub2e4\uc74c: 21\ud3b8 &#8220;pandas \uae30\ucd08&#8221;\n<\/div>\n\n<\/article>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>GET\u00b7POST\u00b7\ud5e4\ub354\u00b7params\u00b7JSON\u00b7timeout\u00b7Session\u00b7\uc778\uc99d\u00b7\uc7ac\uc2dc\ub3c4. 27\ud3b8 \uad50\uc7ac 20\ud3b8.<\/p>\n","protected":false},"author":1,"featured_media":599,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/comments?post=236"}],"version-history":[{"count":1,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/236\/revisions"}],"predecessor-version":[{"id":626,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/236\/revisions\/626"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media\/599"}],"wp:attachment":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media?parent=236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/categories?post=236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/tags?post=236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}