설명
HTTP RESTapi 통신 라이브러리
설치
> python -m pip install --upgrade pip
> pip install requests
SQL
복사
★참고 자료
•
HTTP 상태 코드
requests에서 제공하는 상태코드
status_codes.py
방식
•
GET 방식: requests.get()
•
POST 방식: requests.post()
•
PUT 방식: requests.put()
•
DELETE 방식: requests.delete()
★요청 헤더
인증 토큰(JWT: JSON WEB TOKENs)
•
유저를 인증하고 식별하기 위한 토큰(Token) 기반 인증
•
토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함
•
RESTful과 같은 무상태(Stateless)인 환경에서 사용자 데이터를 주고받을 수 있게 된다.
•
세션(Session)을 사용하게 될 경우 쿠키 등을 통해 사용자를 식별하고 서버에 세션을 저장했지만, 토큰을 클라이언트에 저장하고 요청시 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답받을 수 있다.
requests.post("https://jsonplaceholder.typicode.com/users", headers={'Authorization': 'Bearer 12345'})
# <Response [201]>
Python
복사
User-Agent
•
블로그에서 블로그 관리 기능이 있는데, 여기서 어떤 사람이 어떤 디바이스(PC 또는 모바일이나 태블릿 등)에서 블로그에 방문했는 지 알 수 있습니다.
•
이 때 확인하게 되는 값이 바로 이 User-Agent 값
url = "https://domdom.tistory.com"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
response.status_code
# 200
Python
복사
Referer
•
Referer를 참조함으로써 현재 표시 하는 웹페이지가 어떤 웹페이지에서 요청되었는지 알수 있다.
•
어떤 웹사이트나 웹서버에서 방문자가 왔는지를 파악할수 있는 기능 제공
custom_header = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"referer": "https://pann.ante.com/"
}
url = "https://pann.nate.com/talk/350939697"
response = requests.get(url, headers=custom_header)
response.raise_for_status()
response.status_code
# 200
Python
복사
메서드 → 객체
requests.get()
•
get method로 데이터 보내기
import requests
# 1. 직접 입력해서 보내기
# url에 보내고자 하는 데이터를 입력해서 전송한다.
URL = "http://google.com?user=comp&num=42"
response = requests.get(URL)
print("status code :", response.status_code)
# 2. dict 이용하기
param = { "user" : "comp", "num" : 42 }
response = requests.get(URL, params=param)
print("status code :", response.status_code)
Python
복사
옵션 : timeout=int
•
체류 시간 조정
requests.get('https://github.com/', timeout=0.001)
'''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
'''
Python
복사
requests.post()
•
data 옵션을 사용하면, html 양식(form) 포맷의 데이터를 전송할 수 있고, json 또한 사용가능
•
이 외에도 files 옵션을 통해 file을 전송할 수 있다.
import requests, json
URL = "https://google.com"
# data with json
data = {"outer": {"inner": "value"}}
response = requests.post(URL, data=data)
response = requests.post(URL, data=json.dumps(data))
# json
response = requests.post(URL, json={"name": "test"})
# files
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
Python
복사
requests.put()
requests.delete()
Response객체
.status_code
•
get(), post(), put(), delete()를 통해 반환된 response 객체의 상태 코드를 반환
import requests
response = requests.get("https://google.com")
response.status_code
# 200
response = requests.get("https://google.com/user/")
response.status_code
# 404
Python
복사
.json()
•
json response일 경우 딕셔너리 타입으로 변환
response.json()
'''
type = list타입
[{'userId': 1, 'id': 1, 'title': 'sunt aut facere repellat provident...
'''
Python
복사
.content
•
content 속성을 통해 바이너리 타입으로 데이터 획득
response.content
# b'[\n {\n "userId": 1,\n "id": 1,\n "title": "sunt aut facere...
Python
복사
.text
•
text 속성을 통해 UTF-8로 인코딩된 문자열 획득
response.text
'''
type = string타입
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
{
...
'''
Python
복사
.encoding
•
인코딩 정보 확인
response.encoding
# 'utf-8'
Python
복사
.cookies
•
쿠키 정보 확인
response.encoding
'''
<RequestsCookieJar[Cookie(version=0, name='AEC', value='AVYB7co6OE2VJXuR5HetwhipEUY7JLiZRJM_9I7dpog_beMKxJbtDRlMdqQ', port=None, port_specified=False, domain='.google.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=True, expires=1735744104, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None, 'SameSite': 'lax'}, rfc2109=False), Cookie(version=0, name='NID', value='515=DNJg5hxH9WmHT8MAz7e9s5sX2pAYSUXFm8Zf8RalUgGDpMPZjfTH_4wx241gvbvdLF8P-NILJCZi_H_l7_5D_iafOkE4ycksdfeVKEKrXmT2wbUOluzVYsa3njLxhXE9PlxOcwsj6wq-2IL4Hj4V04pcmoPgpO1dlSL5WUHE1E4', port=None, port_specified=False, domain='.google.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1736003304, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>
'''
Python
복사
.headers
•
응답 헤더 정보 확인
response.headers
'''
{'Date': 'Fri, 05 Jul 2024 15:08:24 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Report-To': '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1712918402&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=xAoN3%2BFLwwlW4nnwAu9KLRC%2FoxCzBfIVobCcPI25AQQ%3D"}]}', 'Reporting-Endpoints': 'heroku-nel=https://nel.heroku.com/reports?ts=1712918402&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=xAoN3%2BFLwwlW4nnwAu9KLRC%2FoxCzBfIVobCcPI25AQQ%3D', 'Nel': '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}', 'X-Powered-By': 'Express', 'X-Ratelimit-Limit': '1000', 'X-Ratelimit-Remaining': '999', 'X-Ratelimit-Reset': '1712918419', 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 'true', 'Cache-Control': 'max-age=43200', 'Pragma': 'no-cache', 'Expires': '-1', 'X-Content-Type-Options': 'nosniff', 'Etag': 'W/"1fd-+2Y3G3w049iSZtw5t1mzSnunngE"', 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'Age': '16787', 'Server': 'cloudflare', 'CF-RAY': '89e8452acda053e7-ATL', 'Content-Encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400'}
'''
response.headers['Content-Type']
# 'application/json; charset=utf-8'
Python
복사