Python运行Traccar集成测试脚本POST数据类型错误如何修复?
问题修复方案
该报错是Python3中urllib库的强制要求:POST请求提交的数据必须为字节类型,不能直接传入字符串。同时原脚本基于Python2编写,存在多处Python2/3兼容性问题,需要统一修改如下:
需要修改的代码位置
1. 修正login函数的编码和请求头
def login(): request = urllib2.Request(baseUrl + '/api/session') # 表单编码结果转字节,指定UTF-8编码 post_data = urllib.parse.urlencode(user).encode('utf-8') # 补充表单提交必备的Content-Type头 request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib2.urlopen(request, post_data) if debug: print('\nlogin: %s\n' % repr(json.load(response))) return response.headers.get('Set-Cookie')
2. 修正add_device函数的JSON数据编码
def add_device(cookie, unique_id): request = urllib2.Request(baseUrl + '/api/devices') request.add_header('Cookie', cookie) request.add_header('Content-Type', 'application/json') device = { 'name' : unique_id, 'uniqueId' : unique_id } # JSON序列化结果转字节 post_data = json.dumps(device).encode('utf-8') response = urllib2.urlopen(request, post_data) data = json.load(response) return data['id']
3. 修正get_protocols函数的urlencode调用
Python3中urlencode方法归属urllib.parse模块,原调用方式会报错:
def get_protocols(cookie, device_id): params = { 'deviceId' : device_id, 'from' : '2000-01-01T00:00:00.000Z', 'to' : '2050-01-01T00:00:00.000Z' } # 替换为urllib.parse.urlencode request = urllib2.Request(baseUrl + '/api/positions?' + urllib.parse.urlencode(params)) request.add_header('Cookie', cookie) request.add_header('Content-Type', 'application/json') request.add_header('Accept', 'application/json') response = urllib2.urlopen(request) protocols = [] for position in json.load(response): protocols.append(position['protocol']) return protocols
4. 修正send_message函数的报文编码
socket发送仅支持字节类型数据:
def send_message(port, message): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', port)) # 字符串转字节后发送 s.send(message.encode('utf-8')) s.close()
5. 可选:修正配置文件路径拼接问题
Windows下硬编码反斜杠可能出现路径错误,改用系统兼容的路径拼接方式:
root = xml.etree.ElementTree.parse(os.path.join(dir, 'default.xml')).getroot()
运行前检查项
- 确认
baseUrl地址、端口和你本地运行的Traccar服务配置一致 - 确认
default.xml文件和脚本在同一目录,该文件可从Traccar安装目录的conf文件夹中获取 - 确认Traccar服务已正常启动后再执行脚本
内容的提问来源于stack exchange,提问作者Jester48
相关产品推荐
相关产品推荐

