许多使用javascript查询API,其中一些查询获得403

问题描述 投票:0回答:3

我正试图让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值和字符串)。

console log

这里有4个值的示例,因此4个查询但只有2个通过。设置间隔没有帮助(我认为API阻塞)。这段代码一切都好吗?我从API创建者那里知道他们不限制查询。

提前致谢

javascript reactjs
3个回答
1
投票

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,您可以让用户知道数据不再存在。等等。


0
投票

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()


0
投票

我在同一时间使用许多请求来轰炸API。帮助使用异步功能

© www.soinside.com 2019 - 2024. All rights reserved.