accept-ranges: bytes access-control-allow-credentials: true access-control-allow-methods: GET,POST,PUT,DELETE,OPTIONS access-control-allow-origin: https://console.his.huawei.com access-control-expose-headers: x-login-url, x-csrf-token access-control-max-age: 1800 connection: keep-alive content-disposition: attachment; filename="riskWarningProcessData20250523112951.xlsx" content-length: 51267 content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet date: Fri, 23 May 2025 03:29:51 GMT keep-alive: timeout=60 x-alb-server: ALB x-server-process-time: 0.731 x-upstream-process-time: 0.73 响应标头如上。 载荷如下: {"warningName":"","rectificationOwner":"","discovererId":"","discoverToolCode":[],"orderList":[],"vulnSourceType":[],"warningSlaStatus":[],"warningPriority":[],"warningStatus":[],"hwItVdIds":[],"cautionCount":[],"confirmSlaStatus":[],"discoverOrganizationCode":[],"warningDateStart":"2024-05-23","warningDateEnd":"2025-05-23","dimensionSetCode":"ALL","dimensionTreeCode":"EAMAP","dimensionCode":"com.huawei.devops.ione","dimensionLevel":"5","dimensionType":"0","dimensionDepth":"5","delegateTenantIds":"11111111111111111111111111111111,88888888888888888888888888888888","delegateTenantNames":"华为技术有限公司,HIS平台运营商","warningIds":[]} 怎么构建请求参数
时间: 2025-05-31 14:48:11 浏览: 29
根据你提供的响应标头和载荷信息,我们可以看到这是一个文件下载请求。构建请求参数的关键在于解析URL中的查询字符串和JSON格式的`RiskWarningQueryVO`字段。
以下是详细的解决方案:
---
### 构建请求参数
#### 1. 解析URL中的查询字符串
从URL中可以看到以下查询参数:
- `dlType=RiskWarningDetailExport`
- `file=riskWarningProcessData`
- `RiskWarningQueryVO=...`
其中,`RiskWarningQueryVO`是一个JSON字符串,需要正确编码为URL格式。
#### 2. 构建JSON格式的`RiskWarningQueryVO`
根据提供的载荷信息,可以将其转换为Python字典,并通过`json.dumps()`方法将其序列化为JSON字符串。
#### 3. 编码JSON字符串为URL格式
由于`RiskWarningQueryVO`是URL的一部分,需要使用`urllib.parse.quote()`对其进行编码。
---
### 示例代码
```python
import requests
import json
from urllib.parse import quote
# 构建RiskWarningQueryVO
risk_warning_query_vo = {
"warningName": "",
"rectificationOwner": "",
"discovererId": "",
"discoverToolCode": [],
"orderList": [],
"vulnSourceType": [],
"warningSlaStatus": [],
"warningPriority": [],
"warningStatus": [],
"hwItVdIds": [],
"cautionCount": [],
"confirmSlaStatus": [],
"discoverOrganizationCode": [],
"warningDateStart": "2024-05-23",
"warningDateEnd": "2025-05-23",
"dimensionSetCode": "ALL",
"dimensionTreeCode": "EAMAP",
"dimensionCode": "com.huawei.devops.ione",
"dimensionLevel": "5",
"dimensionType": "0",
"dimensionDepth": "5",
"delegateTenantIds": "11111111111111111111111111111111,88888888888888888888888888888888",
"delegateTenantNames": "华为技术有限公司,HIS平台运营商",
"warningIds": []
}
# 将RiskWarningQueryVO序列化为JSON字符串并进行URL编码
risk_warning_query_vo_json = json.dumps(risk_warning_query_vo, ensure_ascii=False)
risk_warning_query_vo_encoded = quote(risk_warning_query_vo_json)
# 构建完整的URL
base_url = "https://console.his.huawei.com/asa/gateway/S00000000000000000000000000000605:VULWorkbenchService/vuln-workbench/servlet/download"
params = {
"dlType": "RiskWarningDetailExport",
"file": "riskWarningProcessData",
"RiskWarningQueryVO": risk_warning_query_vo_encoded
}
# 拼接URL
url = f"{base_url}?dlType={params['dlType']}&file={params['file']}&RiskWarningQueryVO={params['RiskWarningQueryVO']}"
# 打印生成的URL
print("生成的URL:", url)
# 发送请求(示例)
headers = {
"Accept": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Referer": "https://console.his.huawei.com/asc/",
"Cookie": "_frid=your_cookie_value_here" # 替换为实际的Cookie值
}
response = requests.get(url, headers=headers, stream=True)
# 检查响应状态码
if response.status_code == 200:
# 保存文件
with open("downloaded_file.xlsx", "wb") as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print("文件下载成功!")
else:
print(f"请求失败,状态码:{response.status_code}")
```
---
### 解释
1. **构建`RiskWarningQueryVO`**:
- 使用Python字典表示JSON对象。
- 使用`json.dumps()`将字典序列化为JSON字符串。
- 使用`urllib.parse.quote()`对JSON字符串进行URL编码,确保特殊字符(如`"`、`:`等)被正确转义。
2. **拼接URL**:
- 将查询参数拼接到基础URL上,形成完整的请求URL。
3. **发送请求**:
- 使用`requests.get()`发送GET请求,并设置`stream=True`以支持流式下载。
- 使用`response.iter_content()`逐块写入文件,避免内存占用过高。
4. **处理响应**:
- 如果响应状态码为200,表示请求成功,保存文件到本地。
- 否则,打印错误状态码以便调试。
---
###
阅读全文
相关推荐



















