2

我目前正在测试创建一个 RESTful json API,在此过程中,我一直在测试通过 curl 发布数据,主要是为了查看是否可以通过请求登录。即使我破解它工作,我也不知道该怎么做,但这是一个单独的问题。

我正在向我的应用程序发送以下 POST 请求:

curl -X POST http://localhost:6543/users/signin -d '{"username":"a@a.com","password":"password"}' 

当我看到我的请求中有什么数据时,输出非常奇怪:

ipdb> self.request.POST
MultiDict([('{"username":"a@a.com","password":"password"}', '******')])
ipdb> self.request.POST.keys()
['{"username":"a@a.com","password":"password"}']
ipdb> self.request.POST.values()
[u'']

所以,它是一个 MultiDict,我的 json 对象作为字符串键,空字符串作为它的值?!这似乎不对。

删除我的 json 声明中的单引号给出以下内容:

ipdb> self.request.POST
MultiDict([('username:a@a.com', u'')])

有谁知道为什么我的数据可能无法正确发布?

更新:

需要明确的是,我使用的标头实际上是 application/x-www-form-urlencoded。

ipdb> self.request.headers['CONTENT-TYPE']
'application/x-www-form-urlencoded'

我发现的是,由于某种原因,当我执行以下操作时,使用requests库可以工作:

In [49]: s.post('http://localhost:6543/users/signin', data=[('username', 'a@a.com'), ('password', 'password')], headers={'content-type': 'application/x-www-form-urlencoded'})
Out[49]: <Response [200]>

但是,它不能像预期的那样与 curl 一起工作的事实仍然令人不安。

4

1 回答 1

4

我不确定您尝试上传哪种内容类型 - application/json 或 application/x-www-form-urlencoded。request.POST仅适用于后一个选项,request.json_body用于解析来自 json 请求正文的数据。

需要明确的是,application/x-www-form-urlencoded 是您的网络浏览器提交表单时使用的格式。这是一种看起来像a=b&c=d&e=f. 从那里您可以期望request.POST包含一个带有键ac和的字典e

于 2013-09-20T03:15:43.527 回答