如何使用axios从飞机场获取所有记录(超过100条)?

时间:2019-03-11 03:32:25

标签: vue.js axios

我正试图获取飞机场中的所有记录,但仅能获取100条记录,但我需要获取100条以上的记录。

a  b
1  4
2  5
3  6
a  b  sum
1  4    5
2  5    7
3  6    9

2 个答案:

答案 0 :(得分:1)

Airtable API最多返回100条记录。您无法更改。默认情况下,它具有分页功能。

您需要拨打多个电话才能获取所有数据。响应将包含一个名为offset的属性。您需要检索它并在下一个呼叫中使用它。

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

下一次调用将返回一个新的offset,依此类推,直到您到达记录的结尾。

答案 1 :(得分:0)

TLDR:
您可以尝试使用在http响应(json)中存在偏移量时执行的递归函数。

致谢:
这个解决方案花了7个小时来研究,排除故障,并获得强大而强大的Doug的建议。该项目使用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.")
    }
}