# XHR请求模块使用说明
## 概述
这是一个基于DrissionPage的XHR请求封装模块,支持多种数据类型和请求方式。相比原版本,新版本支持:
- ✅ 多种数据格式:表单数据、JSON数据、原始文本、二进制数据
- ✅ 自定义请求头
- ✅ 完整的HTTP方法支持:GET、POST、PUT、PATCH、DELETE
- ✅ 统一的API接口
- ✅ 更好的错误处理
## 主要改进
### 1. 统一的request方法
```python
def request(self, method: str, url: str,
data: Optional[Union[Dict[str, Any], str, bytes]] = None,
json_data: Optional[Dict[str, Any]] = None,
headers: Optional[Dict[str, str]] = None,
timeout: int = 30000) -> XHRResponse
```
### 2. 支持多种数据类型
- **Dict**: 自动转换为表单数据 (`application/x-www-form-urlencoded`)
- **str**: 作为原始文本发送 (`text/plain`)
- **bytes**: 作为二进制数据发送 (`application/octet-stream`)
- **json_data**: 作为JSON发送 (`application/json`)
### 3. 便捷方法
- `get(url, headers=None, timeout=30000)`
- `post(url, data=None, json_data=None, headers=None, timeout=30000)`
- `put(url, data=None, json_data=None, headers=None, timeout=30000)`
- `patch(url, data=None, json_data=None, headers=None, timeout=30000)`
- `delete(url, headers=None, timeout=30000)`
## 使用示例
### 基本用法
```python
from DrissionPage import ChromiumPage
from xhr_request import XHRClient
# 创建浏览器实例
page = ChromiumPage()
client = XHRClient(page)
# GET请求
response = client.get('https://api.example.com/data')
print(f"状态码: {response.status_code}")
print(f"响应: {response.text}")
```
### 发送表单数据
```python
# 方式1:使用post方法
form_data = {'username': 'user', 'password': 'pass'}
response = client.post('https://api.example.com/login', data=form_data)
# 方式2:使用通用request方法
response = client.request('POST', 'https://api.example.com/login', data=form_data)
```
### 发送JSON数据
```python
# 方式1:使用post方法
json_data = {'name': '张三', 'age': 25}
response = client.post('https://api.example.com/users', json_data=json_data)
# 方式2:使用通用request方法
response = client.request('POST', 'https://api.example.com/users', json_data=json_data)
```
### 发送原始文本
```python
text_data = "这是一些原始文本数据"
response = client.post('https://api.example.com/text', data=text_data)
```
### 发送二进制数据
```python
binary_data = b'\x00\x01\x02\x03\x04\x05'
response = client.post('https://api.example.com/binary', data=binary_data)
```
### 自定义请求头
```python
headers = {
'Authorization': 'Bearer your-token',
'User-Agent': 'Custom-Client/1.0',
'X-API-Key': 'your-api-key'
}
# GET请求带自定义头
response = client.get('https://api.example.com/protected', headers=headers)
# POST请求带自定义头
response = client.post('https://api.example.com/data',
json_data={'key': 'value'},
headers=headers)
```
### 其他HTTP方法
```python
# PUT请求
response = client.put('https://api.example.com/resource/1',
json_data={'update': 'data'})
# PATCH请求
response = client.patch('https://api.example.com/resource/1',
json_data={'field': 'new_value'})
# DELETE请求
response = client.delete('https://api.example.com/resource/1',
headers={'Authorization': 'Bearer token'})
```
## 响应处理
```python
response = client.get('https://api.example.com/data')
# 检查请求是否成功
if response.ok:
print("请求成功")
else:
print(f"请求失败,状态码: {response.status_code}")
# 获取响应文本
print(response.text)
# 解析JSON响应
try:
data = response.json
print(data)
except ValueError:
print("响应不是有效的JSON格式")
# 获取响应头
print(response.headers)
```
## 错误处理
```python
try:
response = client.post('https://api.example.com/data',
json_data={'key': 'value'})
if response.ok:
print("请求成功")
else:
print(f"HTTP错误: {response.status_code}")
except Exception as e:
print(f"请求失败: {e}")
```
## 注意事项
1. **依赖**: 需要安装DrissionPage: `pip install DrissionPage`
2. **浏览器**: 需要Chromium浏览器实例运行
3. **同步请求**: 当前实现使用同步XHR请求
4. **编码**: 自动处理UTF-8编码
5. **超时**: 默认超时时间为30秒
## 迁移指南
如果你在使用旧版本,以下是主要变更:
### 旧版本
```python
# 表单数据
response = client.request('POST', url, form_data={'key': 'value'})
# JSON数据
response = client.json_request('POST', url, {'key': 'value'})
```
### 新版本
```python
# 表单数据
response = client.post(url, data={'key': 'value'})
# JSON数据
response = client.post(url, json_data={'key': 'value'})
```
新版本向后兼容,但建议使用新的API以获得更好的功能支持。
Raw data
{
"_id": null,
"home_page": "https://github.com/your-username/DrissionPage-expend",
"name": "DrissionPage-expend",
"maintainer": "DrissionPage Community",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "drissionpage, xhr, request, http, automation, web-scraping",
"author": "DrissionPage Community",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/40/53/f4360a2569761dd487f0dd0ac9a3025b700280918490046f7ac90ec1f63c/drissionpage_expend-1.0.1.tar.gz",
"platform": null,
"description": "# XHR\u8bf7\u6c42\u6a21\u5757\u4f7f\u7528\u8bf4\u660e\r\n\r\n## \u6982\u8ff0\r\n\r\n\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8eDrissionPage\u7684XHR\u8bf7\u6c42\u5c01\u88c5\u6a21\u5757\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u7c7b\u578b\u548c\u8bf7\u6c42\u65b9\u5f0f\u3002\u76f8\u6bd4\u539f\u7248\u672c\uff0c\u65b0\u7248\u672c\u652f\u6301\uff1a\r\n\r\n- \u2705 \u591a\u79cd\u6570\u636e\u683c\u5f0f\uff1a\u8868\u5355\u6570\u636e\u3001JSON\u6570\u636e\u3001\u539f\u59cb\u6587\u672c\u3001\u4e8c\u8fdb\u5236\u6570\u636e\r\n- \u2705 \u81ea\u5b9a\u4e49\u8bf7\u6c42\u5934\r\n- \u2705 \u5b8c\u6574\u7684HTTP\u65b9\u6cd5\u652f\u6301\uff1aGET\u3001POST\u3001PUT\u3001PATCH\u3001DELETE\r\n- \u2705 \u7edf\u4e00\u7684API\u63a5\u53e3\r\n- \u2705 \u66f4\u597d\u7684\u9519\u8bef\u5904\u7406\r\n\r\n## \u4e3b\u8981\u6539\u8fdb\r\n\r\n### 1. \u7edf\u4e00\u7684request\u65b9\u6cd5\r\n\r\n```python\r\ndef request(self, method: str, url: str,\r\n data: Optional[Union[Dict[str, Any], str, bytes]] = None,\r\n json_data: Optional[Dict[str, Any]] = None,\r\n headers: Optional[Dict[str, str]] = None,\r\n timeout: int = 30000) -> XHRResponse\r\n```\r\n\r\n### 2. \u652f\u6301\u591a\u79cd\u6570\u636e\u7c7b\u578b\r\n\r\n- **Dict**: \u81ea\u52a8\u8f6c\u6362\u4e3a\u8868\u5355\u6570\u636e (`application/x-www-form-urlencoded`)\r\n- **str**: \u4f5c\u4e3a\u539f\u59cb\u6587\u672c\u53d1\u9001 (`text/plain`)\r\n- **bytes**: \u4f5c\u4e3a\u4e8c\u8fdb\u5236\u6570\u636e\u53d1\u9001 (`application/octet-stream`)\r\n- **json_data**: \u4f5c\u4e3aJSON\u53d1\u9001 (`application/json`)\r\n\r\n### 3. \u4fbf\u6377\u65b9\u6cd5\r\n\r\n- `get(url, headers=None, timeout=30000)`\r\n- `post(url, data=None, json_data=None, headers=None, timeout=30000)`\r\n- `put(url, data=None, json_data=None, headers=None, timeout=30000)`\r\n- `patch(url, data=None, json_data=None, headers=None, timeout=30000)`\r\n- `delete(url, headers=None, timeout=30000)`\r\n\r\n## \u4f7f\u7528\u793a\u4f8b\r\n\r\n### \u57fa\u672c\u7528\u6cd5\r\n\r\n```python\r\nfrom DrissionPage import ChromiumPage\r\nfrom xhr_request import XHRClient\r\n\r\n# \u521b\u5efa\u6d4f\u89c8\u5668\u5b9e\u4f8b\r\npage = ChromiumPage()\r\nclient = XHRClient(page)\r\n\r\n# GET\u8bf7\u6c42\r\nresponse = client.get('https://api.example.com/data')\r\nprint(f\"\u72b6\u6001\u7801: {response.status_code}\")\r\nprint(f\"\u54cd\u5e94: {response.text}\")\r\n```\r\n\r\n### \u53d1\u9001\u8868\u5355\u6570\u636e\r\n\r\n```python\r\n# \u65b9\u5f0f1\uff1a\u4f7f\u7528post\u65b9\u6cd5\r\nform_data = {'username': 'user', 'password': 'pass'}\r\nresponse = client.post('https://api.example.com/login', data=form_data)\r\n\r\n# \u65b9\u5f0f2\uff1a\u4f7f\u7528\u901a\u7528request\u65b9\u6cd5\r\nresponse = client.request('POST', 'https://api.example.com/login', data=form_data)\r\n```\r\n\r\n### \u53d1\u9001JSON\u6570\u636e\r\n\r\n```python\r\n# \u65b9\u5f0f1\uff1a\u4f7f\u7528post\u65b9\u6cd5\r\njson_data = {'name': '\u5f20\u4e09', 'age': 25}\r\nresponse = client.post('https://api.example.com/users', json_data=json_data)\r\n\r\n# \u65b9\u5f0f2\uff1a\u4f7f\u7528\u901a\u7528request\u65b9\u6cd5\r\nresponse = client.request('POST', 'https://api.example.com/users', json_data=json_data)\r\n```\r\n\r\n### \u53d1\u9001\u539f\u59cb\u6587\u672c\r\n\r\n```python\r\ntext_data = \"\u8fd9\u662f\u4e00\u4e9b\u539f\u59cb\u6587\u672c\u6570\u636e\"\r\nresponse = client.post('https://api.example.com/text', data=text_data)\r\n```\r\n\r\n### \u53d1\u9001\u4e8c\u8fdb\u5236\u6570\u636e\r\n\r\n```python\r\nbinary_data = b'\\x00\\x01\\x02\\x03\\x04\\x05'\r\nresponse = client.post('https://api.example.com/binary', data=binary_data)\r\n```\r\n\r\n### \u81ea\u5b9a\u4e49\u8bf7\u6c42\u5934\r\n\r\n```python\r\nheaders = {\r\n 'Authorization': 'Bearer your-token',\r\n 'User-Agent': 'Custom-Client/1.0',\r\n 'X-API-Key': 'your-api-key'\r\n}\r\n\r\n# GET\u8bf7\u6c42\u5e26\u81ea\u5b9a\u4e49\u5934\r\nresponse = client.get('https://api.example.com/protected', headers=headers)\r\n\r\n# POST\u8bf7\u6c42\u5e26\u81ea\u5b9a\u4e49\u5934\r\nresponse = client.post('https://api.example.com/data', \r\n json_data={'key': 'value'}, \r\n headers=headers)\r\n```\r\n\r\n### \u5176\u4ed6HTTP\u65b9\u6cd5\r\n\r\n```python\r\n# PUT\u8bf7\u6c42\r\nresponse = client.put('https://api.example.com/resource/1', \r\n json_data={'update': 'data'})\r\n\r\n# PATCH\u8bf7\u6c42\r\nresponse = client.patch('https://api.example.com/resource/1', \r\n json_data={'field': 'new_value'})\r\n\r\n# DELETE\u8bf7\u6c42\r\nresponse = client.delete('https://api.example.com/resource/1', \r\n headers={'Authorization': 'Bearer token'})\r\n```\r\n\r\n## \u54cd\u5e94\u5904\u7406\r\n\r\n```python\r\nresponse = client.get('https://api.example.com/data')\r\n\r\n# \u68c0\u67e5\u8bf7\u6c42\u662f\u5426\u6210\u529f\r\nif response.ok:\r\n print(\"\u8bf7\u6c42\u6210\u529f\")\r\nelse:\r\n print(f\"\u8bf7\u6c42\u5931\u8d25\uff0c\u72b6\u6001\u7801: {response.status_code}\")\r\n\r\n# \u83b7\u53d6\u54cd\u5e94\u6587\u672c\r\nprint(response.text)\r\n\r\n# \u89e3\u6790JSON\u54cd\u5e94\r\ntry:\r\n data = response.json\r\n print(data)\r\nexcept ValueError:\r\n print(\"\u54cd\u5e94\u4e0d\u662f\u6709\u6548\u7684JSON\u683c\u5f0f\")\r\n\r\n# \u83b7\u53d6\u54cd\u5e94\u5934\r\nprint(response.headers)\r\n```\r\n\r\n## \u9519\u8bef\u5904\u7406\r\n\r\n```python\r\ntry:\r\n response = client.post('https://api.example.com/data', \r\n json_data={'key': 'value'})\r\n if response.ok:\r\n print(\"\u8bf7\u6c42\u6210\u529f\")\r\n else:\r\n print(f\"HTTP\u9519\u8bef: {response.status_code}\")\r\nexcept Exception as e:\r\n print(f\"\u8bf7\u6c42\u5931\u8d25: {e}\")\r\n```\r\n\r\n## \u6ce8\u610f\u4e8b\u9879\r\n\r\n1. **\u4f9d\u8d56**: \u9700\u8981\u5b89\u88c5DrissionPage: `pip install DrissionPage`\r\n2. **\u6d4f\u89c8\u5668**: \u9700\u8981Chromium\u6d4f\u89c8\u5668\u5b9e\u4f8b\u8fd0\u884c\r\n3. **\u540c\u6b65\u8bf7\u6c42**: \u5f53\u524d\u5b9e\u73b0\u4f7f\u7528\u540c\u6b65XHR\u8bf7\u6c42\r\n4. **\u7f16\u7801**: \u81ea\u52a8\u5904\u7406UTF-8\u7f16\u7801\r\n5. **\u8d85\u65f6**: \u9ed8\u8ba4\u8d85\u65f6\u65f6\u95f4\u4e3a30\u79d2\r\n\r\n## \u8fc1\u79fb\u6307\u5357\r\n\r\n\u5982\u679c\u4f60\u5728\u4f7f\u7528\u65e7\u7248\u672c\uff0c\u4ee5\u4e0b\u662f\u4e3b\u8981\u53d8\u66f4\uff1a\r\n\r\n### \u65e7\u7248\u672c\r\n```python\r\n# \u8868\u5355\u6570\u636e\r\nresponse = client.request('POST', url, form_data={'key': 'value'})\r\n\r\n# JSON\u6570\u636e\r\nresponse = client.json_request('POST', url, {'key': 'value'})\r\n```\r\n\r\n### \u65b0\u7248\u672c\r\n```python\r\n# \u8868\u5355\u6570\u636e\r\nresponse = client.post(url, data={'key': 'value'})\r\n\r\n# JSON\u6570\u636e\r\nresponse = client.post(url, json_data={'key': 'value'})\r\n```\r\n\r\n\u65b0\u7248\u672c\u5411\u540e\u517c\u5bb9\uff0c\u4f46\u5efa\u8bae\u4f7f\u7528\u65b0\u7684API\u4ee5\u83b7\u5f97\u66f4\u597d\u7684\u529f\u80fd\u652f\u6301\u3002\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "DrissionPage XHR\u8bf7\u6c42\u6269\u5c55\u5e93\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u7c7b\u578b\u548c\u8bf7\u6c42\u65b9\u5f0f",
"version": "1.0.1",
"project_urls": {
"Bug Tracker": "https://github.com/your-username/DrissionPage-expend/issues",
"Documentation": "https://github.com/your-username/DrissionPage-expend/blob/main/XHR_REQUEST_README.md",
"Homepage": "https://github.com/your-username/DrissionPage-expend",
"Repository": "https://github.com/your-username/DrissionPage-expend"
},
"split_keywords": [
"drissionpage",
" xhr",
" request",
" http",
" automation",
" web-scraping"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "318061c3a64a3e0e10c6c09577582f2cc3e0c00a588af20d4c82d8a3ca2f1f87",
"md5": "dc938f12f6d7cadec0e4e7cfb0188243",
"sha256": "885b9b428f83938124057c42716ed40427c52b348d76187e532aafef13104c42"
},
"downloads": -1,
"filename": "drissionpage_expend-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dc938f12f6d7cadec0e4e7cfb0188243",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 8162,
"upload_time": "2025-07-09T14:43:35",
"upload_time_iso_8601": "2025-07-09T14:43:35.553796Z",
"url": "https://files.pythonhosted.org/packages/31/80/61c3a64a3e0e10c6c09577582f2cc3e0c00a588af20d4c82d8a3ca2f1f87/drissionpage_expend-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4053f4360a2569761dd487f0dd0ac9a3025b700280918490046f7ac90ec1f63c",
"md5": "788f859a235d15c799a6e14753d015d6",
"sha256": "709abcd15b8595cecab7ab103d2f860496e085c83cbb10a9cdd53746be839b9d"
},
"downloads": -1,
"filename": "drissionpage_expend-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "788f859a235d15c799a6e14753d015d6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 15889,
"upload_time": "2025-07-09T14:43:36",
"upload_time_iso_8601": "2025-07-09T14:43:36.640863Z",
"url": "https://files.pythonhosted.org/packages/40/53/f4360a2569761dd487f0dd0ac9a3025b700280918490046f7ac90ec1f63c/drissionpage_expend-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-09 14:43:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "your-username",
"github_project": "DrissionPage-expend",
"github_not_found": true,
"lcname": "drissionpage-expend"
}