request lib
This commit is contained in:
312
Docs/Libs/Requests/requests.md
Normal file
312
Docs/Libs/Requests/requests.md
Normal file
@@ -0,0 +1,312 @@
|
||||
# HTTP Requests in Python with `requests`
|
||||
|
||||
This document explains how to use the **`requests`** library to send HTTP requests, handle responses, work with APIs, upload/download files, manage headers, authentication, errors, and more.
|
||||
|
||||
> `requests` is not part of the standard library and must be installed:
|
||||
```bash
|
||||
pip install requests
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. Sending a Basic GET Request
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
r = requests.get("http://myip.abbascloud.ir")
|
||||
|
||||
print(r.url)
|
||||
print(r.status_code, r.ok)
|
||||
print(r.text)
|
||||
print(r.content)
|
||||
print(r.json())
|
||||
print(r.headers)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- `requests.get(url)` sends an HTTP GET request.
|
||||
- `r.url`: final URL after redirects.
|
||||
- `r.status_code`: HTTP status code (e.g. 200, 404).
|
||||
- `r.ok`: `True` if status code is < 400.
|
||||
- `r.text`: response body as string.
|
||||
- `r.content`: response body as raw bytes.
|
||||
- `r.json()`: parses JSON response into Python objects.
|
||||
- `r.headers`: response headers as a dictionary.
|
||||
|
||||
---
|
||||
|
||||
## 2. Passing Query Parameters
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
params = {
|
||||
"q": "python",
|
||||
"page": 1
|
||||
}
|
||||
|
||||
response = requests.get("https://api.example.com/search", params=params)
|
||||
print(response.url)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- `params` are appended to the URL as query strings.
|
||||
- Automatically encoded by `requests`.
|
||||
- Resulting URL:
|
||||
```
|
||||
https://api.example.com/search?q=python&page=1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Sending POST Requests (Form Data)
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
data = {
|
||||
"username": "alex",
|
||||
"password": "secret"
|
||||
}
|
||||
|
||||
requests.post(url, data=data)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Sends data as `application/x-www-form-urlencoded`.
|
||||
- Common for HTML form submissions.
|
||||
|
||||
---
|
||||
|
||||
## 4. Sending POST Requests (JSON)
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
json_data = {
|
||||
"name": "Alex",
|
||||
"age": 25
|
||||
}
|
||||
|
||||
requests.post(url, json=json_data)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Automatically serializes data to JSON.
|
||||
- Sets `Content-Type: application/json`.
|
||||
- Preferred for REST APIs.
|
||||
|
||||
---
|
||||
|
||||
## 5. Custom Request Headers
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
headers = {
|
||||
"Authorization": "Bearer YOUR_TOKEN",
|
||||
"User-Agent": "MyApp/1.0",
|
||||
"Accept": "application/json"
|
||||
}
|
||||
|
||||
response = requests.get(url, headers=headers)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Used for authentication, API versioning, and content negotiation.
|
||||
- Common headers:
|
||||
- `Authorization`
|
||||
- `User-Agent`
|
||||
- `Accept`
|
||||
|
||||
---
|
||||
|
||||
## 6. Authentication (Basic Auth)
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
from requests.auth import HTTPBasicAuth
|
||||
|
||||
requests.get(
|
||||
"https://api.example.com",
|
||||
auth=HTTPBasicAuth("username", "password")
|
||||
)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Sends credentials using HTTP Basic Authentication.
|
||||
- Automatically encodes credentials in headers.
|
||||
|
||||
---
|
||||
|
||||
## 7. Working with Cookies
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
response = requests.get(url)
|
||||
print(response.cookies)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Cookies are stored in a `RequestsCookieJar`.
|
||||
- Useful for sessions and login persistence.
|
||||
|
||||
---
|
||||
|
||||
## 8. Uploading Files
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
files = {
|
||||
"file": open("example.txt", "rb")
|
||||
}
|
||||
|
||||
response = requests.post(url, files=files)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Sends files as `multipart/form-data`.
|
||||
- Common for file uploads to APIs.
|
||||
|
||||
---
|
||||
|
||||
## 9. Downloading Files
|
||||
|
||||
### Simple Download
|
||||
|
||||
```python
|
||||
response = requests.get("https://example.com/image.png")
|
||||
|
||||
with open("image.png", "wb") as f:
|
||||
f.write(response.content)
|
||||
```
|
||||
|
||||
- Downloads entire file into memory.
|
||||
- Suitable for small files.
|
||||
|
||||
---
|
||||
|
||||
### Streaming Large Files
|
||||
|
||||
```python
|
||||
response = requests.get(url, stream=True)
|
||||
|
||||
with open("big.zip", "wb") as f:
|
||||
for chunk in response.iter_content(chunk_size=8192):
|
||||
f.write(chunk)
|
||||
```
|
||||
|
||||
- Downloads file in chunks.
|
||||
- Prevents high memory usage.
|
||||
- Recommended for large files.
|
||||
|
||||
---
|
||||
|
||||
## 10. Timeout and Error Handling
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
try:
|
||||
response = requests.get(url, timeout=5)
|
||||
response.raise_for_status()
|
||||
except requests.exceptions.Timeout:
|
||||
print("Request timed out")
|
||||
except requests.exceptions.HTTPError as e:
|
||||
print("HTTP error:", e)
|
||||
except requests.exceptions.RequestException as e:
|
||||
print("Request failed:", e)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- `timeout`: maximum wait time (seconds).
|
||||
- `raise_for_status()`: raises exception for 4xx / 5xx errors.
|
||||
- `RequestException`: base class for all request errors.
|
||||
|
||||
---
|
||||
|
||||
## 11. Using Proxies
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
proxies = {
|
||||
"http": "http://127.0.0.1:8080",
|
||||
"https": "http://127.0.0.1:8080"
|
||||
}
|
||||
|
||||
requests.get(url, proxies=proxies)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Routes requests through a proxy server.
|
||||
- Useful for debugging, privacy, or corporate networks.
|
||||
|
||||
---
|
||||
|
||||
## 12. SSL Verification
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
requests.get(url, verify=True) # default
|
||||
requests.get(url, verify=False) # NOT recommended
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- `verify=True` checks SSL certificates.
|
||||
- Disabling SSL verification is insecure and should only be used for testing.
|
||||
|
||||
---
|
||||
|
||||
## 13. Real API Example (GitHub)
|
||||
|
||||
### Code
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
API_URL = "https://api.github.com/users/octocat"
|
||||
|
||||
response = requests.get(API_URL)
|
||||
|
||||
if response.ok:
|
||||
user = response.json()
|
||||
print(user["login"], user["public_repos"])
|
||||
else:
|
||||
print("Error:", response.status_code)
|
||||
```
|
||||
|
||||
### Explanation
|
||||
|
||||
- Sends a GET request to GitHub’s public API.
|
||||
- Parses JSON response.
|
||||
- Accesses specific fields safely.
|
||||
- Checks request success using `response.ok`.
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
- `requests` simplifies HTTP communication
|
||||
- Supports GET, POST, headers, params, JSON, files
|
||||
- Handles authentication, cookies, proxies, and SSL
|
||||
- Built-in error handling improves reliability
|
||||
- Widely used for REST APIs and web services
|
||||
Reference in New Issue
Block a user