我已经在网上搜索了一段时间,但是找不到如何使用普通客户端javascript(没有node-js,jquery等)的GitHub API的示例。我想要一些像authenticate那样的东西,然后推送一个blob,尽可能简单地让我理解它。不应该太复杂,我打赌你可以用十几行代码做到这一点,但我不太了解ajax,json和jsonp。
你能提供一个让我入门的例子吗?
谢谢!
编辑发现了这个:http://blog.vjeux.com/category/javascript,但我仍然对这个过程的具体步骤感到困惑。
答案 0 :(得分:26)
如果您希望使用vanilla JavaScript(即没有框架),则需要使用XMLHttpRequest
对象。 XMLHttpRequest
为AJAX实现提供了核心。
尽管有XMLHttp
前缀,但您不仅限于XML或HTTP。您可以检索任何数据类型(例如JSON)并使用其他协议,例如FTP。
假设我们想从GitHub GET
提供您的用户信息。通过浏览器,我们可以通过访问https://api.github.com/users/funchal轻松提出请求。
使用XMLHttpRequest
发送HTTP请求与// Create a new request object
var request = new XMLHttpRequest();
// Initialize a request
request.open('get', 'https://api.github.com/users/funchal')
// Send it
request.send()
:
readyState
如果你从JavaScript控制台开始,你可能会感到有些失望:什么都不会立即发生。您必须等待服务器响应您的请求。从您创建实例化请求对象到服务器响应之间,对象将经历一系列状态更改,由UNSENT
属性的值表示:
open()
:OPENED
未提及send()
:HEADERS_RECIEVED
未提及send()
:标题和状态在LOADING
responseText
:DONE
仍在下载response
:Wahoo!完成所有操作后,您可以检查数据的request.readyState // => 4 (We've waited enough)
request.response // => "{whatever}"
属性:
XMLHttpRequest#open()
使用void open(
DOMString method,
DOMString url,
optional boolean async,
optional DOMString user,
optional DOMString password
);
时,您需要考虑几个选项。这是方法签名:
false
第三个参数(默认为true)指示是否应异步进行响应。如果将其设置为#send()
,则必须等到onload
的响应完成后才能返回,并且您将支付阻止整个程序的价格。因此,我们以异步方式编码,以便我们的程序即使在我们等待时也能保持响应。这种异步性是通过使用和事件监听器(a.k.a.事件处理程序)和回调函数来实现的。
假设我们只想在响应到达时将响应转储到控制台。我们首先需要创建一个我们想要执行function dumpResponse() {
// `this` will refer to the `XMLHTTPRequest` object that executes this function
console.log(this.responseText);
}
的回调函数:
onload
然后我们将此回调设置为XMLHttpRequest
接口定义的var request = new XMLHttpRequest();
// Set the event handler
request.onload = dumpResponse;
// Initialize the request
request.open('get', 'https://api.github.com/users/funchal', true)
// Fire away!
request.send()
事件的侦听器/处理程序:
JSON.parse()
现在,由于您将以字符串形式接收数据,因此您需要使用function printRepoCount() {
var responseObj = JSON.parse(this.responseText);
console.log(responseObj.name + " has " + responseObj.public_repos + " public repositories!");
}
var request = new XMLHttpRequest();
request.onload = printRepoCount;
request.open('get', 'https://api.github.com/users/funchal', true)
request.send()
// => Giovanni Funchal has 8 public repositories!
解析字符串以执行任何有意义的操作。假设我想调试您的公共存储库的数量以及您的名称。我可以使用此函数将字符串解析为JSON,然后我可以提取我想要的属性:
XMLHttpRequest
有关{{1}}的更多信息,请参阅the W3C spec和Mozilla Developer Network。