You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:30:01