Как получить все записи (более 100) из таблицы с помощью Axios? - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь получить все записи, присутствующие в авиационном расписании, но получаю только 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)
  });
}

Ответы [ 2 ]

1 голос
/ 11 марта 2019

API Airtable возвращает максимум 100 записей. Вы не можете это изменить. По умолчанию включена пагинация.

Вам нужно сделать несколько звонков, чтобы получить все ваши данные. Ответ будет содержать свойство с именем offset. Вам нужно получить его и использовать при следующем вызове.

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

Следующий вызов вернет новый offset и т. Д. До тех пор, пока вы не достигнете конца своих записей.

0 голосов
/ 17 мая 2019

TLDR:
Вы можете попробовать использовать рекурсивную функцию, которая выполняется, когда в ответе http (json) существует смещение.

Подтверждение:
Это решение заняло 7 часов исследований, поиска неисправностей и советов от великого и влиятельного Дуга. Проект использует Alamofire для выполнения http-запросов и SwiftyJson для доступа к JSON.

Причина:
В документации Airtable указывается, что их лимит скорости составляет 100 единиц на запрос. Если запрос содержит более 100 элементов, запрос будет включать смещение.

Они дают указание включить смещение в ваш следующий запрос, чтобы получить следующие 100 результатов. Но они не объясняют и не демонстрируют, как это сделать.

Решение:
Он был протестирован на получение 2565 элементов из 25 HTTP-запросов. Написанная на 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.")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...