尝试从 GitLab API 获取具有特殊字符的文件时出现 Http 404

Http 404 when trying to get files with special characters from GitLab API

我正在为 Gitlab API 使用 python-gitlab 驱动程序。以下在我的存储库上运行良好:

>>> rf_blob = p.repository_blob(p_latest_commit.id, 'iOSBoilerplate/GooglePlus/GoogleOpenSource.framework/Versions/A/Headers/GTMOAuth2Authentication.h')
>>> rf_blob = p.repository_blob(p_latest_commit.id, 'iOSBoilerplate/GooglePlus/GoogleOpenSource.framework/Versions/A/Headers/GTMOAuth2SignIn.h')

但是,当我尝试打开一个包含 + 字符的文件时,即使该文件显然存在于存储库中,我也会得到以下信息:

>>> rf_blob = p.repository_blob(p_latest_commit.id, 'iOSBoilerplate/GooglePlus/GoogleOpenSource.framework/Versions/A/Headers/GTMNSString+URLArguments.h')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/gitlab/objects.py", line 1521, in repository_blob
    raise_error_from_response(r, GitlabGetError)
  File "/usr/local/lib/python2.7/site-packages/gitlab/exceptions.py", line 140, in raise_error_from_response
    response_body=response.content)
gitlab.exceptions.GitlabGetError: 404: 404 File Not Found

我该如何转义 python 中的 + 以便获取文件的 blob?

解决方法是使用urllib.quote.

python-gitlab 是对真正的 Gitlab API 的表面包装。 Gitlab API 在 url 请求上运行,所以这个解决方案看起来很自然:

rf_blob = p.repository_blob(p_latest_commit.id, urllib.quote('iOSBoilerplate/GooglePlus/GoogleOpenSource.framework/Versions/A/Headers/GTMNSString+URLArguments.h'))