【问题标题】:Spaces in a URL when using requests and python使用请求和 python 时 URL 中的空格
【发布时间】:2014-09-26 20:47:00
【问题描述】:

我希望我能解释一下自己。不用自欺欺人。

我正在尝试使用 python 3.4 将 url 发送到 sparkcore api。

我已经设法从 windows 命令行直接使用 curl:-

curl https://api.spark.io/v1/devices/xxxxxxxxxxxxxxx/led -d access_token=yyyyyyyyyyyyyyyy -d params=l1,HIGH

一切正常。 led-d 之间有一个空格,但这不是问题。

我读过reting 在python 中使用libcurl 执行此操作非常痛苦,我看到很多关于使用请求的消息,所以我想试试看。

于是我写了一个小程序:

import requests

r = requests.get('https://api.spark.io/v1/devices/xxxxxxxxxxxxxxxxxx/led -d access_token=yyyyyyyyyyyyyyyyy -d params=l1,HIGH')
print(r.url)
print(r)

我得到回报:

<Response [400]>

当我检查实际发出的 URL 时,URL 中的空格被替换为 %20。这似乎是我的实际问题,因为请求添加的 %20 混淆了失败的服务器

“代码”:400, “错误”:“无效请求”, "error_description": "未找到访问令牌"

我已经尝试阅读如何在不通过编码添加 %20 的情况下使用空格,但我确实可以使用指向正确方向的指针。

谢谢

利亚姆

【问题讨论】:

  • 你能改写这个问题吗?我不认为你的解释很清楚。
  • %20 是空格字符的 REST 解释,当您在 url 栏中放置一组搜索词时,谷歌就是这样读取它的。网址中没有空格。为什么是你的?
  • 我从来没有实际添加 %20,我确实在我的 url 中使用了空格,并且在 windows 命令行中使用 curl 可以正常工作,如果我将相同的 url 复制并粘贴到请求命令 python脚本失败,当我使用 print(r.url) 时,空格被替换为 %20,作为响应,我从 Requests 中返回。
  • url 以 led 结尾,从 -d 开始是发送给 curl 的选项。 Requests 期望第一个参数只是 url。
  • 其实就是 POST xxxxxx 到 url。 Requests 非常易于使用,对于 post,您只需将包含您的数据的字典传递给它。

标签: python curl request


【解决方案1】:

网址不能有空格。您使用的 curl 命令实际上是使用一些命令行参数(使用 -d)向 url https://api.spark.io/v1/devices/xxxxxxxxxxxxxxx/led 发出请求

curl man (manual) page 说明了 -d 命令行参数

-d,--数据

(HTTP) 将 POST 请求中的指定数据发送到 HTTP 服务器,就像浏览器在用户填写 HTML 表单并按下提交按钮时所做的那样。这将导致 curl 使用 content-type application/x-www-form-urlencoded 将数据传递给服务器。与 -F、--form 比较。

-d,--data 与--data-ascii 相同。要发布纯二进制数据,您应该使用 --data-binary 选项。要对表单字段的值进行 URL 编码,您可以使用 --data-urlencode。

如果在同一命令行上多次使用这些选项中的任何一个,则指定的数据片段将与分隔符 & 符号合并在一起。因此,使用“-d name=daniel -d Skill=lousy”会生成一个看起来像“name=daniel&skill=lousy”的帖子块。

如果您以字母 @ 开头数据,其余部分应该是用于读取数据的文件名,或者 - 如果您希望 curl 从标准输入读取数据。也可以指定多个文件。因此,将使用 --data @foobar 从名为“foobar”的文件发布数据。当 --data 被告知从这样的文件中读取时,回车符和换行符将被删除。

也就是说-d 是用于使用内容类型application/x-www-form-urlencoded 使用POST 请求向URL 发送数据

请求文档中有一个很好的例子来说明如何使用请求库来做到这一点:http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests

所以对于你的 curl 命令,我认为这应该可以工作

import requests
payload = {'access_token': 'yyyyyyyyyyyyyyyy', 'params': 'l1,HIGH'}
r = requests.post("https://api.spark.io/v1/devices/xxxxxxxxxxxxxxx/led", data=payload)
print(r.text)

【讨论】:

  • 嗨,Ben,这就是我想要做的事情。谢谢。我已经开始考虑有效载荷选项,但它在我的脑海中变得有点模糊,特别是当它已经很晚了。您还详细介绍了 curl/url(无空格)的继承限制,使事情成为焦点。有一个有效的例子真的把它拉到了一起。再次感谢。答案很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2013-11-25
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
相关资源
最近更新 更多