You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python requests获取CBP清算通知表单结果时持续返回500状态码的问题求助

使用Python requests获取CBP清算通知表单结果时持续返回500状态码的问题求助

看起来你第一次用requests调用CBP的清算通知搜索接口就碰到了服务器内部错误,我帮你梳理几个大概率的问题点和解决方案:

1. 请求体序列化方式错误

你现在直接把Python字典传给data参数,requests会默认把它编码成表单格式(application/x-www-form-urlencoded),但接口要求的是JSON格式的请求体。你应该把data=payload改成json=payload,这样requests会自动帮你把字典序列化为JSON字符串,也能保证Content-Type头的匹配(虽然你手动设置了,但用json参数更稳妥)。

2. 缺失会话Cookie或关键请求头

政府类接口通常会校验会话状态,你可能需要先访问主页面获取会话Cookie,再带着Cookie发起POST请求。另外,浏览器请求时会自动携带Referer头,部分接口会校验这个字段,建议也加上。可以用requests.Session()来自动管理Cookie:

# 用会话保持Cookie
session = requests.Session()
# 先访问主页面获取会话标识
session.get(url)
# 再发起POST请求
response = session.post(searchUrl, headers=headers, json=payload)

3. Payload中的布尔值类型错误

看你payload里的"searchable": "true"是字符串类型的布尔值,但很多JSON接口期望的是原生布尔值(true/false,不是字符串)。你需要把这些字符串改成Python的布尔值True/False,让requests序列化成正确的JSON格式。比如把"searchable": "true"改成"searchable": True"regex": "false"改成"regex": False

4. 对比浏览器请求,补全缺失参数

你可以打开浏览器开发者工具的Network面板,抓一次手动提交的请求,对比你的请求头和payload是否和浏览器完全一致:

  • 检查是否有X-CSRF-Token这类的校验头需要携带
  • 确认draw参数是否需要和页面会话匹配
  • 查看是否有其他隐藏的请求参数你没包含

修改后的示例代码

import requests

headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Content-Type': 'application/json; charset=UTF-8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
    'Referer': 'https://trade.cbp.dhs.gov/ace/liquidation/LBNotice/'
}

payload = {
    "dtPageVars": {
        "draw": 1,
        "columns": [
            {"data": "postedDate", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "eventDate", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "voidedDate", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "event", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "basis", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "action", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "entryNumber", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "portOfEntry", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "entryDate", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "entryType", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}},
            {"data": "teamNumber", "name": "", "searchable": True, "orderable": False, "search": {"value": "", "regex": False}}
        ],
        "order": [],
        "start": 0,
        "length": 100,
        "search": {
            "value": "",
            "regex": False
        }
    },
    "searchFields": {
        "portOfEntry": "0101",
        "entryType": "01"
    }
}

url = 'https://trade.cbp.dhs.gov/ace/liquidation/LBNotice/'
searchUrl = 'https://trade.cbp.dhs.gov/ace/liquidation/LBNotice/search'

session = requests.Session()
session.get(url)
response = session.post(searchUrl, headers=headers, json=payload)

print(response.status_code)
# 打印响应内容,服务器可能会返回错误详情
print(response.text)

额外提示

如果还是返回500,一定要打印response.text看看服务器返回的具体错误信息,很多时候500状态码会附带详细的错误描述,能直接帮你定位问题。requests完全可以处理这类接口请求,只要你能匹配浏览器的请求模式,不用急着换其他方法。

备注:内容来源于stack exchange,提问作者Ryne

火山引擎 最新活动