Как использовать 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
}