Github API响应“内容无效Base64”

时间:2014-04-09 03:56:29

标签: ruby rest base64 github-api

我收到的内容无效Base64'使用API​​向github发布某个非常简单的内容时出错。内容是

 unit = $("<li  class='s   clearfix'></li>");

我正在使用Base64.urlsafe_encode64来编码内容。

content = 'unit = $("<li  class=\'s   clearfix\'></li>")';
url = "https://api.github.com/repos/#{github_user}/#{github_repo}/contents/#{path}"
RestClient.put(url, 
                   { 
                      message: "my message", 
                      content: Base64.urlsafe_encode64(content), 
                      encoding:"base64" }.to_json,
                   { 
                      params:{access_token:access_token
                   },accept:'json'}){ |response, request, result| 
   puts response.code
   puts response
}

我得到了这个回应:

422
{"message":"content is not valid Base64",
 "documentation_url":"https://developer.github.com/v3/repos/contents/"}

我不明白这对github来说是不是有效的base64。并且所有提交的数据都不会发生。

content='unit = $("<li  class=\'s   clearfix\'></li>")'
Base64.urlsafe_decode64(Base64.urlsafe_encode64(content))==content
=> true

我做错了什么?

2 个答案:

答案 0 :(得分:3)

原则上内容必须使用符合RFC 4648的 Base64.strict_encode 进行编码。我在github上找到了解决方案:https://github.com/octokit/octokit.rb/blob/5323df945ecfd524556888e35d042a96c9055a1c/lib/octokit/client/contents.rb#L76

答案 1 :(得分:1)

当我考虑Content API时,我不会看到字段&#39;编码&#39;当你输入信息时。
我只在答案中看到它(如in this one)。

如果您看到go-github项目(在Go中,但想法相同),您会看到用于设置消息的结构:RepositoryContentFileOptions

// RepositoryContentFileOptions specifies optional parameters for CreateFile, UpdateFile, and DeleteFile.
type RepositoryContentFileOptions struct {
  Message *string `json:"message,omitempty"`
  Content []byte `json:"content,omitempty"`
  SHA *string `json:"sha,omitempty"`
  Branch *string `json:"branch,omitempty"`
  Author *CommitAuthor `json:"author,omitempty"`
  Committer *CommitAuthor `json:"committer,omitempty"`
}

tests don't encode anything

message := "m"
content := []byte("c")
repositoryContentsOptions := &RepositoryContentFileOptions{
  Message: &message,
  Content: content,
  Committer: &CommitAuthor{Name: String("n"), Email: String("e")},
}

在您的情况下(红宝石),content应该足够了。