我的web应用的用户需要以GitHub问题的形式提供bug报告,并预先生成标题和正文。
这在使用GET小体时完全可以正常工作。
const title = getLastErrorTitle();
const body = getAllTheLogMessages();
window.open(`https://github.com/theuser/therepo/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`);
如果用户已经登录,GitHub就会向用户展示一个新的问题,标题和正文都已经填好了,很完美。如果没有,GitHub就会提示用户登录,下一次就可以了。
但是,如果正文过大,GET请求就会因为URL过长而失败。
在咨询了 手册 我试着用POST做同样的事情,但我从GitHub得到的是404,测试请求如下(为简洁起见用jQuery)。
$.ajax({
type: "POST",
url: "https://api.github.com/repos/theuser/therepo/issues",
data: data = {title: "Test", body: "Test Body"},
});
我的怀疑是,GitHub API的设计并没有考虑到我的用例,但POST总是需要认证,并且一次性就能创建完整的问题,而不像GET那样可以让用户事先更改。
如何将GET方法的功能转移到POST方法上?我只是想让GitHub向当前在浏览器内登录的用户提供一个预先填充的问题,而不需要标记。
你不能这样做。否则,这将是一个主要的CSRF漏洞。
然而,你可以使用OAuth认证,这将允许你的应用程序使用一些功能。https:/developer.github.comappsbuilding-oauth-appsauthorizing-oauth-apps。
或者简单地将用户重定向到一个新的问题页面(例如用一个简单的HTML链接 <a>
)与一些自动内容,使用这种模式。
https://github.com/{theUser}/{theRepo}/issues/new?body={theContentYouWhant}&title={theTitleYouWhant}
我在这里建议的是生成一个 personal_auth_token
在gihub的头文件中传递这个令牌,并将此令牌传递到 Authorization
字段。
要生成personal_auth_token,请登录到github.com,进入到 设置 -> 开发者设置 -> 个人访问令牌 并生成一个。
在Auhtorization下的headers中传递这个token。token. 所以在你的AJAX请求中,它可能看起来像这样。
$.ajax({
url: *yourUrl*
...
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', *token*));
},
});
有一点需要注意的是,每一个开发人员 POST
ing到repo的用户需要生成他们的访问令牌,由于明显的安全漏洞,你不能将这个令牌推送到公共Github仓库。如果你不小心这样做了,这个令牌会被立即撤销,你将需要创建一个新的令牌。