我打开 Hackerrank 示例测试并尝试使用可能用于进行 AJAX 调用的方法。
XMLHttpReq
、fetch
等。它们都不起作用; XHR
和 fetch
方法不可用。
首先
fetch
:
async function myFetch() {
let response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
let data = await response.json();
console.log(data);
}
Hackerrank 会抛出错误,因为
fetch
不是函数。我也尝试了window.fetch
和global.fetch
,但没有成功。
我试过了
XHR
:
function myXHR() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
console.log(this.responseText);
// or JSON.parse(this.responseText);
}
};
xmlhttp.open('GET', 'https://jsonplaceholder.typicode.com/todos/1');
xmlhttp.send();
}
Hackerrank 说
XMLHttpRequest
未定义。
Hackerrank 正在执行 Node.JS 代码,这解释了为什么
XHR
不可用,也许我必须要求自己。除了我不能npm install
任何东西,我所能访问的只是他们的小IDE。
如何在这个平台上使用 JavaScript 进行 AJAX 调用?
我已经通过了 HackerRank REST API 认证,并且遇到了同样的问题。 HackerRank 使用 NodeJs 环境来运行代码(在语言选择中提到),因此 XMLHttpRequest 和 fetch 都不可用(因为这些仅适用于浏览器)。
request
npm 包,HackerRank 允许你要求它。
一个缺点是请求不支持 Promises 和 Async/Await,除非您导入其他包(HackerRank 似乎无法识别)。
这是我用过的:
const request = require('request');
function myFetch(url) {
return new Promise((resolve, reject) => {
request(url, function (error, response, body) {
if(error) reject(error)
else resolve(body)
});
});
}
注意:请求包最近已被弃用,但它仍然适合您的用例。
我最近在 HackerRank 中进行了测试,我使用了 http/https 的 Node.js 本机模块从 API 获取数据。因为您可以使用它而不需要任何外部库。
此外,如果您需要创建 Promise,您可以在 https 实现上创建您自己的包装。
尝试使用这个:
async function fetchData(url) {
const https = require('https');
return new Promise((resolve, reject) => {
https.get(url, (response) => {
let data = '';
response.on('data', (stream) => {
data += stream;
})
response.on('end', () => {
const resolvedData = JSON.parse(data);
resolve(data);
})
}).on('error', (err) => {
reject(err);
})
});
}
async function showData() {
const data = await fetchData('https://jsonmock.hackerrank.com/api/movies?Year=2000');
console.log(data);
}
showData();
这可以解决您在 HackerRank 中的问题。此示例仅针对 get 请求给出。对于所有其他方法,请尝试使用 https
的
Node.js
模块中的 options。
Hackerrank 目前使用 axios 附带的节点版本 14.x.xx。 您所要做的就是滚动到顶部并导入或需要 axios,然后您可以根据情况使用
axios.get()
或 axios.post()
。
获取呼叫示例:
a)
const axios = require('axios');
let response = await axios.get('URL here');
以同样的方式,您可以使用所有HTTP方法。
let url = 'https://someurl.com/api/article_users?username=username';
const https = require('https');
https.get(url, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
}).on('error', (e) => {
console.error(e);
});
这对我有用。
刚刚在 HackerRank 中进行了其余测试,并尝试了:
const fetch = require('node-fetch');
而且它也有效。提供与您习惯的相同的获取界面。