4

我正在构建一个应用程序,它使用 Requests 库获取 Airtable 上的数据库并将其转换为列表。

我的问题是我只能通过 URL 请求获得 100 条记录。我试图在 Airtable API 中找到解决方案,但是插入 maxRecords 的 URL 更改不起作用。

我正在使用这个 URL 来获取数据。但它只返回 100 条记录。

    https://api.airtable.com/v0/appP6G7OJmLzUCoUt/Table%201?api_key=MY_KEY

我已阅读有关 maxRecords 和分页的信息,但我找不到更改 URL 以使用它的方法。

有人可以帮助我吗?

4

3 回答 3

1

正如我在其他帖子中看到的,很多人都在处理同样的问题。我试图找到解决方案,但我无法用 URL 修复它。

虽然,谢天谢地,使用 Airtable API 库在 Python 中更容易从 Airtable 获取所有数据。( http://airtable-python-wrapper.readthedocs.io/en/master/ )

有一个名为 get_all() 的函数,它接受 maxRecords 参数。只需调用 x.get_all(),内部不带参数,API 将返回表中的每条记录。

于 2018-02-28T04:13:55.927 回答
1

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

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

原因:
在 Airtable 文档中,他们声明他们的速率限制是每个请求 100 个项目。如果请求的项目超过 100 个,则请求将包含偏移量。

他们给出了一个指令,在你的下一个请求中包含偏移量以获得下一个 100 个结果。但是,他们没有解释或演示如何做到这一点。

解决方案:
已测试从 25 个 http 请求中检索 2,565 个项目。用 Swift 编写,逻辑很简单:

编写一个带有可选偏移量参数的递归函数。调用没有偏移量的函数。检查偏移量的 http 响应 (json)。如果偏移量存在,则将 http 请求 (json) 存储在函数外部的数组中。然后,从内部调用相同的函数 - 这次使用偏移量。

扩展代码在这里。

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.")
    }
}
于 2019-05-17T01:50:51.220 回答
0

这是我在 Python 中用来解决这个问题的代码——根据 Christian 的回答,我使用了递归调用。但是,我发布此代码 b/c OP 要求用 Python 回答。

def get_airtable_data(email_dict=None, offset=None):
        """
        queries airtable and creates a dict of {name: email} from records that are 
        listed as subscribed
        """

    if email_dict is None:
        email_dict = {}
    r = requests.get(request_url, headers={"Authorization": bearer_token}, params={"pageSize": 100, "offset": offset})
    r_json = json.loads(r.text)
    for item in r_json["records"]:
        if item["fields"]["subscribed"] == 1:
            email_dict[item["fields"]["Name"]] = item["fields"]["Primary Email"]

    if r_json["offset"] is None:
        print("all data loaded")
    else:
        try:
            get_airtable_data(email_dict, r_json["offset"])
        except KeyError:
            print("all data loaded")
    return email_dict
于 2020-03-08T19:37:58.640 回答