使用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




