python - 通过curl/urllib2向Pyramid应用程序发送json数据没有给出正确的请求。POST

标签 python json curl request pyramid

我目前正在测试创建一个 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 包含一个带有键 ace 的字典。

关于python - 通过curl/urllib2向Pyramid应用程序发送json数据没有给出正确的请求。POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907898/

相关文章:

Python Ctypes 异常 : access violation reading

javascript - Json数据提取

javascript - JSON 中的多行元素?

javascript - 解析 JSON 对象以获取列数据

ssl - centos6/letsencrypt - wget 证书错误,但 curl 没有

http - Curl GET/POST 原始数据包括 header ?

php - 与 mail.google.com、cURL 和 http ://validator. w3.org/checklink 混淆

python - 如果没有某些特定值,则计算数据帧列中的行数

python - Python 中的递归函数 : Best way to get a list of specific nested items

python - Blobstore 备份策略 Google App Engine Python