【问题标题】:Python Requests Invalid URL Label errorPython请求无效的URL标签错误
【发布时间】:2013-05-09 19:56:55
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 那是你真正的 API 密钥和密码吗??为了以防万一,我已经删除了一半
  • 没有。那是一个虚拟的 URL。但是,api_url的所有部分的长度都和原来的一样。
  • 哦,好消息!只是想我会检查!现在我会调查你的错误:-)

标签: python shopify


【解决方案1】:

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

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

对于长用户名:密码,这可能会引发“标签为空或太长”错误。你可以试试report it on the requests' issue tracker。

a:b@example.com form is deprecated 否则 如果 username:password 中的所有字符都来自 [-A-Za-z0-9._~!$&'()*+,;=] 集合,requests.get('https://a:b@example.com') 应该等同于 requests.get('https://example.com', auth=('a', 'b'))。

curl 和 requests 也不同,用户信息中有百分比编码的字符,例如,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'

【讨论】:

  • 也可以是简单的事情,比如在请求中使用了错误的字符串,例如。值而不是键(反之亦然)。 for file in files: response = requests.get("{}/{}".format(url, file)) # you might need files[file] here
【解决方案2】:

这不是 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]>

【讨论】:

  • 我确定这是导致错误的原因!非常感谢!不过有一个疑问——为什么 curl 可以正常工作?
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多