Python请求无效的URL标签错误

时间:2013-05-09 19:56:55

标签: python shopify

我正在尝试访问使用以下网址格式的Shopify API: https://apikey:password@hostname/admin/resource.xml

e.g。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

知道我为什么会这样吗?直接在浏览器中滚动/打开链接工作正常。是因为URL的长度太长了吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

这不是URL的长度。如果我这样做:

import requests
test_url = 'http://www.google.com/?somereallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongurl=true'
r = requests.get(test_url)

返回<Response [200]>

您是否尝试过请求身份验证参数detailed here

>>> requests.get('http://iliketurtles.myshopify.com/admin/orders.xml', auth=('ea7a2ff231f9f7', '95c5e8091839609c864'))
<Response [403]>

答案 1 :(得分:3)

错误('URL has an invalid label.')可能是requests库中的错误:它在附加了userinfo的主机名上应用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._~!$&'()*+,;=]

curlrequests也有所不同,然后userinfo中存在百分比编码字符,例如,https://a:%C3%80@example.com会导致curl生成以下http标头:

Authorization: Basic YTrDgA==

但是requests会产生:

Authorization: Basic YTolQzMlODA=

即:

>>> import base64
>>> base64.b64decode('YTrDgA==')
'a:\xc3\x80'
>>> print _
a:À
>>> base64.b64decode('YTolQzMlODA=')
'a:%C3%80'