如何使用axios从airtable中获取所有记录(超过100个)?

x3naxklr  于 2023-03-23  发布在  iOS
关注(0)|答案(3)|浏览(224)

我试图获取所有的记录目前在airtable,但它只让我100记录只,但我需要获取超过100记录。

loadListings(){
  var self = this;
  var app_id = "**********";
  var app_key = "**********";
  axios.get(
      "https://api.airtable.com/v0/"+app_id+"/Weekly%20Report?view=Main%20View",
      {
          headers: { Authorization: "Bearer "+app_key }
      }
  ).then(function(response){
    console.log(response.data.records);
    self.listings = response.data.records;
  }).catch(function(error){
    console.log(error)
  });
}
ehxuflar

ehxuflar1#

Airtable API最多返回100条记录,不可更改,默认自带分页。
您需要进行多次调用以获取所有数据。响应将包含一个名为offset的属性。您需要检索它并在下次调用中使用它。

https://api.airtable.com/v0/"+app_id+"/Weekly%20Report?view=Main%20View&offset=previously_saved_offset

下一个调用将返回一个新的offset,如此类推,直到到达记录的末尾。

4xy9mtcn

4xy9mtcn2#

顶级域名:

你可以尝试使用一个递归函数,当http响应(json)中存在偏移量时执行。

鸣谢:

这个解决方案花了7个小时的研究,故障排除和建议,从伟大的,强大的道格。该项目使用Alamofire执行http请求,SwiftyJson访问JSON。

原因:

在Airtable文档中,他们声明他们的费率限制是每个请求100个项目。如果请求超过100个项目,请求将包括偏移。
他们给予了一个指令,在下一个请求中包含偏移量,以获得下一个100个结果。但是,他们没有解释或演示如何做到这一点。

解决方案:

它已经被测试从25个http请求中检索2,565个项目。用Swift编写,逻辑很简单:
编写一个递归函数,其中包含一个可选的偏移量参数。调用不带偏移量的函数。检查http响应(json)中的偏移量。如果偏移量存在,则将http请求(json)存储在函数外部的数组中。然后,从函数内部调用同一个函数-这次使用偏移量。
code在这里

func requestAirtableRecords(forTable table: String, withTableView tableView: String, withOffset offset: String?, completion: @escaping ([JSON]) -> ()) {
    let parameters: [String: Any] = offset != nil ? ["view": tableView, "offset": offset!] : ["view": tableView]
    do {
        let url: URLRequest = try self.requestRecordsURL(table: table, method: HttpRequest.get, parameters: parameters)!
        Alamofire.request(url).responseJSON { (response) in
            switch response.result {
            case .success(_):
                let json = JSON(response.result.value!)
                self.jsonArray.append(json)
                let nextOffset = json["offset"]
                if nextOffset.exists() {
                    self.requestAirtableRecords(forTable: table, withTableView: tableView, withOffset: nextOffset.stringValue, completion: { _ in
                        completion(self.jsonArray)
                    })
                } else {
                    completion(self.jsonArray)
                }
            case .failure(let error):
                print(error)
            }
        }
    } catch {
        print("Error: Unable to request records from Airtable.")
    }
}
yb3bgrhw

yb3bgrhw3#

这里有一个简单的解决方案,只使用axios。你不需要使用airtable.js
注意。如果返回的行数少于100行,则offset将为null(缺少),否则函数将自动递归调用自己,直到没有更多的行(offset为null)。当递归的promise链被解析时,所有的行都被连接到一个列表中。

//****************************************
//    BEGIN SOURCE CODE 

let baseUrl = 'https://api.airtable.com/v0';
let appName = 'app1-put-your-app-here';
let secret = 'patDWabcdefghijk.ec98---put-your-own-secret-key-here----6a9ca';
let headers = { Authorization: 'Bearer ' + secret };

function getTable(tableName, params) {
    let config = { headers, params };
    return axios.get(baseUrl + '/' + appName + '/' + tableName, config).then(response => {
        let result = response.data.records.map(r => r.fields);
        let offset = response.data.offset;
        if (offset != null)
            return getTable(tableName, {offset}).then(data => result.concat(data));
        return result;
    }, error => {
        return {error: error.message, code: error.code};
    });
}

您可以使用params只选择某些记录,例如...

getTable('devices', { filterByFormula: '{DeviceID} > 5'}).then(devlist => {
    console.log(devlist);
});

相关问题