Как использовать API Ticketmaster в Swift

Я впервые пытаюсь использовать API и получаю сообщение об ошибке «keyNotFound». Может ли кто-нибудь указать мне правильное направление, чтобы лучше понять это? Вот ссылка на их документацию: https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/#anchor_find .

      let apiKey = "************"
    
    struct EventResponse : Decodable{
        let events : [Event]
    }
    
    struct Event : Decodable{
        let id : String?
    }
    
    func fetchTMEvents() async throws -> [Event]{
        let urlTM = URL(string: "https://app.ticketmaster.com/discovery/v2/events.json?apikey=\(apiKey)")!
        let(data, _) = try await URLSession.shared.data(from: urlTM)
        let decoded = try JSONDecoder().decode(EventResponse.self, from: data)
        return decoded.events
    }
      Task {
            do {
                let events = try await fetchTMEvents()
                print("API results \(events)")
            } catch {
                print("API error \(error)")
            }
        }

Полная ошибка:

keyNotFound(CodingKeys(stringValue: "events", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "Нет значения, связанного с ключом CodingKeys(stringValue: "events", intValue: nil) ("events" ).", базовая ошибка: ноль))

1 ответ

Попробуйте эти тестовые модели, чтобы получить и декодироватьevents. Пример кода в SwiftUI показывает, как отображать результаты.

Обратите внимание: у вас должен быть действительныйapiKeyв противном случае ответ не будет декодируемым.

Чтобы получить полный набор моделей структур, просто скопируйте данные json (все) в https://app.quicktype.io/ , и основная часть кода будет сгенерирована за вас. Настройте этот код в соответствии с вашими потребностями.

Вам придется обратиться к документации, чтобы определить, какие структуры/свойства являются необязательными, а затем добавить?им.

      struct ContentView: View {
    @State var events: [Event] = []
    
    var body: some View {
        List(events) { event in
            Text(event.name)
        }
        .task {
            do {
                if let results = try await fetchTMEvents() {
                    events = results
                }
            } catch {
                print("---> error: \(error)")
            }
        }
    }
    
    func fetchTMEvents() async throws -> [Event]? {
        let apiKey = "xxxxxxx"
        let urlTM = URL(string: "https://app.ticketmaster.com/discovery/v2/events.json?apikey=\(apiKey)")!
        let(data, _) = try await URLSession.shared.data(from: urlTM)
        // print(String(data: data, encoding: .utf8))
        let decoded = try JSONDecoder().decode(EventResponse.self, from: data)
        return decoded.embedded.events
    }
}

struct EventResponse: Codable {
    let embedded: ResponseEmbedded
    let page: Page

    enum CodingKeys: String, CodingKey {
        case page
        case embedded = "_embedded"
    }
}

struct ResponseEmbedded: Codable {
    let events: [Event]?
}

struct Event: Codable, Identifiable {
    let name, type, id, url, locale: String
}

struct Page: Codable {
    let size, totalElements, totalPages, number: Int
}
Другие вопросы по тегам