使用请求和python时URL中的空格

时间:2014-09-26 20:47:01

标签: python curl request

我希望我能解释一下自己。没有自己制作一个屁股。

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

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

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

一切正常。 <{1}}和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)

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

  

&#34;代码&#34;:400,   &#34;错误&#34;:&#34; invalid_request&#34;,   &#34; error_description&#34;:&#34;未找到访问令牌&#34;

我已经尝试过阅读有关如何通过编码添加%20的空间,但我真的可以使用正确方向的指针。

由于

利安

1 个答案:

答案 0 :(得分:0)

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

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

-d, - data

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

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

如果在同一命令行中多次使用这些选项中的任何一个,则指定的数据将与分离&amp; -symbol合并在一起。因此,使用'-d name = daniel -d skill = lousy'会生成一个看起来像'name = daniel&amp; skill = lousy'的帖子块。

如果使用字母@开始数据,则其余部分应该是用于读取数据的文件名,或者 - 如果您希望curl从stdin读取数据。也可以指定多个文件。因此,可以使用--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)