Decoding base64 while using GitHub API to Download a File
我正在使用GitHub API从GitHub下载文件。我已经能够成功地进行身份验证,并从GitHub获得响应,并且看到了表示文件内容的base64编码字符串。
不幸的是,在解码base64字符串时,我得到了一个异常错误(字符串长度不是4的倍数)。
HTTP请求如下图所示:
1 | GET /repos/:owner/:repo/contents/:path |
(部分)响应如下图所示:
1 2 3 4 5 6 | { "name":...., "download_url":...", "type":"file", "content":"ewogICAgInN3YWdnZXIiOiAiM... } |
我遇到的问题是字符串的长度是15263字节,在解码字符串时出错(字符串长度不是4的倍数)。我正在使用node.js和'base64 js'NPM模块对字符串进行解码。执行解码的代码如下所示:
1 2 | var base64 = require('base64-js'); var contents = base64.toByteArray(fileContent); |
解码导致异常:
1 2 3 4 5 | Error: Invalid string. Length must be a multiple of 4 at placeHoldersCount (.../node_modules/base64-js/index.js:23:11) at Object.toByteArray (...node_modules/base64-js/index.js:42:18) : : |
我认为GithubAPI正在向我发送正确的数据,所以我认为这不是问题所在。
我是否执行解码不正确,或者我忽略了另一个问题?
感谢您的帮助。
我做了一点实验,找到了一个解决方案,使用不同的base64解码库,如下所示:
1 2 | var base64 = require('js-base64').Base64; var contents = base64.decode(res.content); |
我不确定是否强制要求编码的字符串长度可以被4整除(显然,我的15263个字符长度的字符串不能被4整除),但是备用库正确地解码了该字符串。
第二个解决方案是如何使用GitHub API,我也发现它是有效的。通过将以下内容添加到Github API调用头中,我还可以获得解码后的文件内容:
1 | 'accept': 'application/vnd.github.VERSION.raw' |
经过大量的试验,我认为我确定了工作和坏base64解码之间的区别。
似乎Github Base-64编码为:
- UTF-8字符集
- 基64 MIME编码器(RFC2045)
与"基本"(RFC4648)base64编码器不同。一些语言似乎默认为基本的编码器(包括Java,我使用的)。当我切换到一个mime编码器时,我得到了文件的完整内容。这可以解释为什么在某些情况下切换库可以解决这个问题。
我会注意到"内容"字段包含换行符-解码器应该忽略它们,但并非全部都忽略它们,因此如果仍然出现错误,您可能需要尝试删除它们。
media-type头将更好地完成这项工作,但是在我的例子中,我正试图通过GitHub应用程序使用API——在编写时,GitHub要求使用特定的媒体类型,并返回JSON响应。
出于某种原因,GithubAPI base64编码的内容在我从Google首页尝试的所有在线base64解码器中都无法正确解码。
但是,python可以工作:
1 2 | import base64 base64.b64decode("ewogICAgInN3YWdnZXIiOiAiM...") |