使用urllib2向Toggl API发送json数据时出现HTTP 400错误

2 投票
2 回答
3889 浏览
提问于 2025-04-16 10:40

当我使用以下代码连接到 toggl api 时,我的连接和授权都没有问题。

username = token
password = 'api_token'
url = 'http://www.toggl.com/api/v3/tasks.json'

req = urllib2.Request(url)
auth_string = base64.encodestring('%s:%s' % (username, password))
req.add_header("Authorization", "Basic %s" % auth_string)
f = urllib2.urlopen(req)
response = f.read()

但是,当我尝试开始一个新任务时,我需要以json格式发送数据。为了测试,我创建了我的json对象,并把数据添加到我的请求对象中。

data = simplejson.dumps({
    'task':{
        'duration': 1,
        'billable': True,
        'start': '2010-02-12T16:19:45+02:00',
        'description': 'This is a test task',
    }
})
req = urllib2.Request(url, data)

但现在我收到的唯一响应是“urllib2.HTTPError: HTTP Error 400: Bad Request”。有人能告诉我哪里出错了吗?

2 个回答

2

我已经搞明白了。多亏了TryPyPy,我发现我需要在请求中添加一个'Content-type'的头信息。

我还需要把我的认证字符串中的换行符和回车符去掉。

auth_string = base64.encodestring('%s:%s' % (username, password)).strip()
3

根据API文档,你至少缺少一个头部信息。可以试试这样:

req = urllib2.Request(url, data, {"Content-type": "application/json"})

如果这样还不行,可以尝试对数据使用urllib.urlencode。如果还是不行,就在请求中添加一个用户名和密码,就像API示例中那样。

撰写回答