Update
This commit is contained in:
170
docs/Programmation/Python/requests.md
Normal file
170
docs/Programmation/Python/requests.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# Requests
|
||||
|
||||
|
||||
|
||||
https://realpython.com/python-requests/
|
||||
|
||||
https://realpython.com/caching-external-api-requests/
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
pip3 install requests
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### Requête GET:
|
||||
|
||||
```python
|
||||
>>> import requests
|
||||
>>> requests.get('https://api.github.com')
|
||||
<Response [200]>
|
||||
|
||||
>>> requests.get('https://api.github.com', timeout=1)
|
||||
<Response [200]>
|
||||
# nb de second avant un timeout
|
||||
```
|
||||
|
||||
##### Status Code:
|
||||
|
||||
```python
|
||||
>>> response = requests.get('https://api.github.com')
|
||||
>>> print(response)
|
||||
<Response [200]>
|
||||
>>> response.status_code
|
||||
200
|
||||
>>> if response.status_code == 200:
|
||||
... print('Success!')
|
||||
... elif response.status_code == 404:
|
||||
... print('Not Found.')
|
||||
...
|
||||
Success!
|
||||
```
|
||||
|
||||
```python
|
||||
import requests
|
||||
from requests.exceptions import HTTPError
|
||||
|
||||
for url in ['https://api.github.com', 'https://api.github.com/invalid']:
|
||||
try:
|
||||
response = requests.get(url)
|
||||
|
||||
# If the response was successful, no Exception will be raised
|
||||
response.raise_for_status()
|
||||
except HTTPError as http_err:
|
||||
print(f'HTTP error occurred: {http_err}') # Python 3.6
|
||||
except Exception as err:
|
||||
print(f'Other error occurred: {err}') # Python 3.6
|
||||
else:
|
||||
print('Success!')
|
||||
|
||||
# la 1ere url répond par un Success
|
||||
# la 2nde par une erreur
|
||||
```
|
||||
|
||||
##### Content:
|
||||
|
||||
```python
|
||||
# bytes
|
||||
>>> response.content
|
||||
b'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}","commit_search_url":"https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}","emails_url":"https://api.github.com/user/emails","emojis_url":"https://api.github.com/emojis","events_url":"https://api.github.com/events","feeds_url":"https://api.github.com/feeds","followers_url":"https://api.github.com/user/followers","following_url":"https://api.github.com/user/following{/target}","gists_url":"https://api.github.com/gists{/gist_id}","hub_url":"https://api.github.com/hub","issue_search_url":"https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}","issues_url":"https://api.github.com/issues","keys_url":"https://api.github.com/user/keys","notifications_url":"https://api.github.com/notifications","organization_repositories_url":"https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}","organization_url":"https://api.github.com/orgs/{org}","public_gists_url":"https://api.github.com/gists/public","rate_limit_url":"https://api.github.com/rate_limit","repository_url":"https://api.github.com/repos/{owner}/{repo}","repository_search_url":"https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}","current_user_repositories_url":"https://api.github.com/user/repos{?type,page,per_page,sort}","starred_url":"https://api.github.com/user/starred{/owner}{/repo}","starred_gists_url":"https://api.github.com/gists/starred","team_url":"https://api.github.com/teams","user_url":"https://api.github.com/users/{user}","user_organizations_url":"https://api.github.com/user/orgs","user_repositories_url":"https://api.github.com/users/{user}/repos{?type,page,per_page,sort}","user_search_url":"https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"}'
|
||||
|
||||
# string
|
||||
>>> response.encoding = 'utf-8'
|
||||
>>> response.text
|
||||
|
||||
# JSON
|
||||
>>> response.json()
|
||||
{'current_user_url': 'https://api.github.com/user', 'current_user_authorizations_html_url': 'https://github.com/settings/connections/applications{/client_id}', 'authorizations_url': 'https://api.github.com/authorizations', 'code_search_url': 'https://api.github.com/search/code?q={query}{&page,per_page,sort,order}', 'commit_search_url': 'https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}', 'emails_url': 'https://api.github.com/user/emails', 'emojis_url': 'https://api.github.com/emojis', 'events_url': 'https://api.github.com/events', 'feeds_url': 'https://api.github.com/feeds', 'followers_url': 'https://api.github.com/user/followers', 'following_url': 'https://api.github.com/user/following{/target}', 'gists_url': 'https://api.github.com/gists{/gist_id}', 'hub_url': 'https://api.github.com/hub', 'issue_search_url': 'https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}', 'issues_url': 'https://api.github.com/issues', 'keys_url': 'https://api.github.com/user/keys', 'notifications_url': 'https://api.github.com/notifications', 'organization_repositories_url': 'https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}', 'organization_url': 'https://api.github.com/orgs/{org}', 'public_gists_url': 'https://api.github.com/gists/public', 'rate_limit_url': 'https://api.github.com/rate_limit', 'repository_url': 'https://api.github.com/repos/{owner}/{repo}', 'repository_search_url': 'https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}', 'current_user_repositories_url': 'https://api.github.com/user/repos{?type,page,per_page,sort}', 'starred_url': 'https://api.github.com/user/starred{/owner}{/repo}', 'starred_gists_url': 'https://api.github.com/gists/starred', 'team_url': 'https://api.github.com/teams', 'user_url': 'https://api.github.com/users/{user}', 'user_organizations_url': 'https://api.github.com/user/orgs', 'user_repositories_url': 'https://api.github.com/users/{user}/repos{?type,page,per_page,sort}', 'user_search_url': 'https://api.github.com/search/users?q={query}{&page,per_page,sort,order}'}
|
||||
# retourne un dictionnaire
|
||||
```
|
||||
|
||||
##### Headers:
|
||||
|
||||
```python
|
||||
>>> response.headers
|
||||
{'Server': 'GitHub.com', 'Date': 'Fri, 29 Mar 2019 15:32:44 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Status': '200 OK', 'X-RateLimit-Limit': '60', 'X-RateLimit-Remaining': '59', 'X-RateLimit-Reset': '1553877164', 'Cache-Control': 'public, max-age=60, s-maxage=60', 'Vary': 'Accept', 'ETag': 'W/"7dc470913f1fe9bb6c7355b50a0737bc"', 'X-GitHub-Media-Type': 'github.v3; format=json', 'Access-Control-Expose-Headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type', 'Access-Control-Allow-Origin': '*', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains; preload', 'X-Frame-Options': 'deny', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Referrer-Policy': 'origin-when-cross-origin, strict-origin-when-cross-origin', 'Content-Security-Policy': "default-src 'none'", 'Content-Encoding': 'gzip', 'X-GitHub-Request-Id': 'B245:1134:87E5:14D2A:5C9E3A9C'}
|
||||
|
||||
# retourne un dictionnaire
|
||||
|
||||
>>> response.headers['Content-Type']
|
||||
'application/json; charset=utf-8'
|
||||
```
|
||||
|
||||
##### Query strings parameters:
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
# Search GitHub's repositories for requests
|
||||
response = requests.get(
|
||||
'https://api.github.com/search/repositories',
|
||||
params={'q': 'requests+language:python'},
|
||||
)
|
||||
|
||||
# Inspect some attributes of the `requests` repository
|
||||
json_response = response.json()
|
||||
repository = json_response['items'][0]
|
||||
print(f'Repository name: {repository["name"]}') # Python 3.6+
|
||||
print(f'Repository description: {repository["description"]}') # Python 3.6+
|
||||
|
||||
Repository name: requests
|
||||
Repository description: Python HTTP Requests for Humans™ ✨🍰✨
|
||||
```
|
||||
|
||||
##### Autres méthodes HTTP:
|
||||
|
||||
```python
|
||||
>>> requests.post('https://httpbin.org/post', data={'key':'value'})
|
||||
>>> requests.put('https://httpbin.org/put', data={'key':'value'})
|
||||
>>> requests.delete('https://httpbin.org/delete')
|
||||
>>> requests.head('https://httpbin.org/get')
|
||||
>>> requests.patch('https://httpbin.org/patch', data={'key':'value'})
|
||||
>>> requests.options('https://httpbin.org/get')
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### Requête POST:
|
||||
|
||||
```python
|
||||
>>> requests.post('https://httpbin.org/post', data={'key':'value'})
|
||||
<Response [200]>
|
||||
```
|
||||
|
||||
```python
|
||||
>>> response = requests.post('https://httpbin.org/post', json={'key':'value'})
|
||||
>>> json_response = response.json()
|
||||
>>> json_response['data']
|
||||
'{"key": "value"}'
|
||||
>>> json_response['headers']['Content-Type']
|
||||
'application/json'
|
||||
```
|
||||
|
||||
```python
|
||||
>>> response = requests.post('https://httpbin.org/post', json={'key':'value'})
|
||||
>>> response.request.headers['Content-Type']
|
||||
'application/json'
|
||||
>>> response.request.url
|
||||
'https://httpbin.org/post'
|
||||
>>> response.request.body
|
||||
b'{"key": "value"}'
|
||||
```
|
||||
|
||||
|
||||
|
||||
Authentification:
|
||||
|
||||
```python
|
||||
>>> from requests.auth import HTTPBasicAuth
|
||||
>>> from getpass import getpass
|
||||
>>> requests.get(
|
||||
... 'https://api.github.com/user',
|
||||
... auth=HTTPBasicAuth('bruno@xxxxx.info', getpass())
|
||||
... )
|
||||
Password:
|
||||
<Response [200]>
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user