我目前正在测试创建一个 RESTful json API,在此过程中我一直在测试通过curl 发布数据,主要是为了看看是否可以通过请求登录。即使我破解它以使其工作,我也不知道该怎么做,但这是一个单独的问题。
我正在向我的应用发送以下 POST 请求:
curl -X POST http://localhost:6543/users/signin -d '{"username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5e3f1e3f703d3133" rel="noreferrer noopener nofollow">[email protected]</a>","password":"password"}'
当我看到请求中的数据时,输出非常奇怪:
ipdb> self.request.POST
MultiDict([('{"username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="523312337c313d3f" rel="noreferrer noopener nofollow">[email protected]</a>","password":"password"}', '******')])
ipdb> self.request.POST.keys()
['{"username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1d0f1d09fd2dedc" rel="noreferrer noopener nofollow">[email protected]</a>","password":"password"}']
ipdb> self.request.POST.values()
[u'']
所以,它是一个 MultiDict,其中我的 json 对象作为字符串键,空白字符串作为其值?!这似乎不对。
删除 json 声明中的单引号会得到以下结果:
ipdb> self.request.POST
MultiDict([('username:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cfae8faee1aca0a2" rel="noreferrer noopener nofollow">[email protected]</a>', u'')])
有人知道为什么我的数据无法正确发布吗?
更新:
需要明确的是,我使用的 header 实际上是 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 href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="264766470845494b" rel="noreferrer noopener nofollow">[email protected]</a>'), ('password', 'password')], headers={'content-type': 'application/x-www-form-urlencoded'})
Out[49]: <Response [200]>
事实上,它不能像预期的那样与curl一起工作,这仍然令人不安。
最佳答案
我不确定您正在尝试上传哪种内容类型 - 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
包含一个带有键 a
、c
和 e
的字典。
关于python - 通过curl/urllib2向Pyramid应用程序发送json数据没有给出正确的请求。POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907898/