3

我正在尝试访问 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

知道为什么我会得到这个吗?卷曲/直接在浏览器中打开链接工作正常。是不是因为网址太长了?

谢谢!

4

2 回答 2

3

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

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

返回<Response [200]>

您是否尝试过使用此处详述的请求身份验证参数发出请求

>>> requests.get('http://iliketurtles.myshopify.com/admin/orders.xml', auth=('ea7a2ff231f9f7', '95c5e8091839609c864'))
<Response [403]>
于 2013-05-09T20:29:59.850 回答
3

错误 ( 'URL has an invalid label.') 可能是requests库中的错误:它idna在附加了用户信息的主机名上应用编码(用于国际化域名),来源

netloc = netloc.encode('idna').decode('utf-8')

对于长用户名:密码,这可能会引发“标签为空或太长”错误。您可以尝试在请求的问题跟踪器上报告它

a:b@example.com不推荐使用表单,否则 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 标头:

Authorization: Basic YTrDgA==

requests产生:

Authorization: Basic YTolQzMlODA=

IE:

>>> import base64
>>> base64.b64decode('YTrDgA==')
'a:\xc3\x80'
>>> print _
a:À
>>> base64.b64decode('YTolQzMlODA=')
'a:%C3%80'
于 2013-05-10T00:29:24.047 回答