我正在尝试访问 Shopify 的 API,它使用的 URL 格式为 -
https://apikey:password@hostname/admin/resource.xml
例如http://7ea7a2ff231f9f7:95c5e8091839609c864@iliketurtles.myshopify.com/admin/orders.xml
执行 $curl api_url
会下载正确的 XML,但是当我这样做时
import requests
api_url = 'http://7ea7a2ff231f9f7d:95c5e8091839609c864@iliketurtles.myshopify.com/admin/orders.xml'
r = requests.get(api_url) # Invalid url label error
知道我为什么会收到这个吗?直接在浏览器中 curl /打开链接工作正常。是因为网址太长了吗?
谢谢!
最佳答案
错误('URL 有一个无效的标签。'
)可能是 requests
库中的错误:它应用 idna
编码(对于国际化域名)在附有用户信息的主机名上,source :
netloc = netloc.encode('idna').decode('utf-8')
对于长用户名:密码,这可能会引发“标签为空或太长”错误。你可以试试report it on the requests' issue tracker .
a:b@example.com
form is deprecated否则
requests.get('https://a:b@example.com')
应该等同于 requests.get('https://example.com', auth=(' a', 'b'))
如果用户名:密码中的所有字符都来自 [-A-Za-z0-9._~!$&'()*+,;=]
设置。
curl
和 requests
也不同,然后在用户信息中有百分比编码的字符,例如,https://a:%C3%80@example.com
导致 curl
生成以下 http header :
Authorization: Basic YTrDgA==
但是请求
产生:
Authorization: Basic YTolQzMlODA=
即:
>>> import base64
>>> base64.b64decode('YTrDgA==')
'a:\xc3\x80'
>>> print _
a:À
>>> base64.b64decode('YTolQzMlODA=')
'a:%C3%80'
关于Python Requests Invalid URL Label 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470064/