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

使用Requests Session获取CSRF Token后调用接口失败的技术问询

问题排查:使用requests.Session()调用NSCorp接口时出现"Object reference not set..."错误

首先,我注意到你的代码里有几个关键问题,这些大概率就是触发错误的根源,咱们一步步拆解分析:

1. 请求URL存在无效空格

你的第二个请求URL里藏了个多余的空格:

url = 'https://accessns.nscorp.com/accessNS/rest/backend/ServicesIndustrial/ services/industrial2/v2/onsite/details'
# 注意这里的"ServicesIndustrial/ services/"中间多了一个空格!

这个空格会让请求指向一个不存在的接口路径,服务器无法正确解析你的请求,自然会返回无效输入类的错误。这是最容易忽略但影响极大的问题。

2. 手动处理Cookie干扰了Session的自动管理

使用requests.Session()的核心价值就是它会自动维护会话的CookieJar,不需要你手动提取Cookie再拼到headers里。你手动设置headers['Cookie']的操作,会覆盖Session自动管理的Cookie,甚至可能丢失服务器要求的Cookie属性(比如domain、path、HttpOnly标记等),导致服务器无法识别你的合法会话。

3. CSRF Token的添加方式可以优化

虽然你提取Token的逻辑没问题,但更稳妥的方式是把Token添加到Session的默认headers中,这样后续所有请求都会自动带上,不需要每次请求都单独构造headers。


修正后的代码

with requests.Session() as s:
    # 1. 发送登录请求,Session自动保存会话Cookie
    login_payload = {'Id': 'username', 'pwd': 'password'}
    auth_response = s.post('https://accessns.nscorp.com/accessNS/rest/auth/login', json=login_payload)
    auth_response.raise_for_status()  # 新增:检查登录请求是否成功,避免后续用无效Token
    
    # 2. 将CSRF Token添加到Session的默认请求头,后续请求自动携带
    csrf_token = auth_response.json()['response']['token']
    s.headers.update({'CSRFTOKEN': csrf_token})
    
    # 3. 修正目标URL,去掉多余空格
    target_url = 'https://accessns.nscorp.com/accessNS/rest/backend/ServicesIndustrial/services/industrial2/v2/onsite/details'
    
    # 4. 发送接口请求,Session自动带上Cookie和CSRF Token
    payload = {'userId': 'username', 'classCode': 'classcode', 'stationCode': 'stationcode'}
    inv_response = s.post(target_url, json=payload)
    
    # 新增:检查接口请求状态,方便调试定位问题
    inv_response.raise_for_status()
    print(inv_response.json())

额外说明

你手动硬编码能成功,是因为复制的URL没有空格,且Cookie是浏览器中完整的会话Cookie;而之前的代码因为路径错误+Cookie管理混乱,导致会话不合法或请求路径无效,最终触发了服务器的错误提示。

内容的提问来源于stack exchange,提问作者manwithfewneeds

火山引擎 最新活动