使用Python3调用API写入数据库时出现空值是什么原因?
问题定位步骤
- 先打印Python代码拼接的完整请求URL,确认参数没有空值、拼写错误、特殊字符未转义的问题
- 打印请求返回的
response.text内容,200状态码仅代表HTTP链路通了,不代表业务处理成功,接口大概率返回了你没捕获的参数缺失提示 - 对比浏览器请求和Python请求的差异:浏览器地址栏输入URL发起的是GET请求,参数全部放在URL查询串中,你当前Python用POST方法、参数放查询串的模式不符合DbGate的接口要求,导致接口没有正确读取到传入的参数,存储过程调用时用了默认空值写入数据库。
修复方案
方案1:对齐浏览器行为,改用GET请求(改造成本最低,推荐优先验证)
不要直接拼接URL字符串,用requests自带的params参数自动处理编码,避免特殊字符导致的参数异常:
import requests from requests_ntlm import HttpNtlmAuth # 这里替换成你的实际基础接口地址 base_url = "https://www.myurl.com/api/mssql/dbo/uspAddLaneTimings" db_user = "你的数据库用户名" db_password = "你的数据库密码" def setup_http_request(rfidUniqueId, mac_address, my_id_count): send_http_request(base_url, rfidUniqueId, mac_address, my_id_count) def send_http_request(base_url, rfidUniqueId, mac_address, my_id_count): try: auth = HttpNtlmAuth(db_user, db_password) # 用params传查询参数,自动做URL编码 response = requests.get( base_url, params={ "laneSequence": my_id_count, "rfidUniqueId": rfidUniqueId, "planningLaneSeq": my_id_count, "sensorId": mac_address }, auth=auth ) # 打印返回内容验证结果 print("返回状态码:", response.status_code) print("返回内容:", response.text) except Exception as e: print("请求出错:", str(e))
方案2:如果业务要求必须用POST请求,参数放在请求体中传输
DbGate的POST接口默认从请求体中读取参数,不要拼在URL里:
import requests from requests_ntlm import HttpNtlmAuth base_url = "https://www.myurl.com/api/mssql/dbo/uspAddLaneTimings" db_user = "你的数据库用户名" db_password = "你的数据库密码" def setup_http_request(rfidUniqueId, mac_address, my_id_count): send_http_request(base_url, rfidUniqueId, mac_address, my_id_count) def send_http_request(base_url, rfidUniqueId, mac_address, my_id_count): try: auth = HttpNtlmAuth(db_user, db_password) payload = { "laneSequence": my_id_count, "rfidUniqueId": rfidUniqueId, "planningLaneSeq": my_id_count, "sensorId": mac_address } # 用json格式传POST参数 response = requests.post( base_url, json=payload, auth=auth ) print("返回状态码:", response.status_code) print("返回内容:", response.text) except Exception as e: print("请求出错:", str(e))
内容的提问来源于stack exchange,提问作者Simple Simon
相关产品推荐
相关产品推荐

