我正试图让API休息。这是我的反应代码:
var URL = 'myurl&partno=';
handleSearch(){
var numbers = this.state.newTodo.split("\n");
var queries = [];
var response;
var parseString = require('xml2js').parseString;
var responses = [];
var URL = 'myurl&partno=';
numbers.forEach((number)=>{
queries.push(URL.concat(number));
response = axios.get(URL.concat(number),{
method: 'GET',
mode: 'no-cors',
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'text/plain',
},
withCredentials: true,
credentials: 'same-origin',
});
response.then(res => {
parseString(res.data, (err, result)=> {
var r = result.result.data[0].row;
console.log(r);
r.forEach(row => {
responses.push(row);
})
this.setState(()=>({
responseItems: responses
}) )
});
});
});
};
很抱歉隐藏网址,但我不想发布它。此代码从state获取值,然后转换为数组。接下来,它构建查询(concat值和字符串)。
这里有4个值的示例,因此4个查询但只有2个通过。设置间隔没有帮助(我认为API阻塞)。这段代码一切都好吗?我从API创建者那里知道他们不限制查询。
提前致谢
403错误是forbidden
。因此,您尝试访问不允许使用的REST API的一部分。因此,如果您需要针对某些请求的额外凭据,或者如果成功的查询不需要凭据,那么请与API管理员联系,因此您的凭据是错误的。
控制台中的承诺结果错误是由拒绝承诺的403响应引起的。并且您没有任何错误处理程序来捕获该承诺错误。所以我建议在你的代码中添加一个.catch()
块来捕获这个错误:
response
.then( res => {
// do things with the responses.
})
.catch( error => {
// Catch errors here.
});
承诺错误现在将消失,403结果将触发此.catch()
条款。因此,您可以在此处添加任何错误处理。例如,使用403,您希望让用户知道他们正在尝试查询他们无权访问的数据。如果响应是超时,您可以在此处重复调用API。如果响应是404,您可以让用户知道数据不再存在。等等。
403错误来自服务器,通常是AUTH问题。接下来,您的代码:
1 - 对于干净的代码,尝试使用axios.all()或Promise.all()聚合查询
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "foo");
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
2 - Array.map()提供了一个更好的API来管理数组和转换,让你忘记了Array.push()和forEach
var numbers = [1, 5, 10, 15];
var roots = numbers.map(function(x) {
return x * 2;
});
// roots is now [2, 10, 20, 30]
// numbers is still [1, 5, 10, 15]
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots is now [1, 2, 3]
// numbers is still [1, 4, 9]
3 - 无需解析已经作为JSON提供的Axios响应
4 - 不要使用var,更喜欢const或let
5 - 除了Axios.then(),利用Axios.catch()
我在同一时间使用许多请求来轰炸API。帮助使用异步功能