Google 图书 API GET 请求 returns 空白屏幕

Google Books API GET Request returns blank screen

大家好

所以我是learning/practicing网络电话。我看到了 Paul Hudson 的一段视频,他在视频中使用我在这里尝试使用的相同代码调用 Itunes API。但是,我正在尝试调用 Google Books API。我的电话(下面的代码)不起作用,它(returns 一个空白屏幕)我不确定为什么。我当然使用来自 URL 的变量,我正在尝试 call/make 来自

的请求
import SwiftUI

struct Response: Codable {
    var results: [Result]
}

struct Result: Codable {
    var id: Int
    var etag: String
}

struct ContentView: View {
    @State private var results = [Result]()
    
    var body: some View {
        List(results, id: \.id) { item in
            VStack(alignment: .leading) {
                Text(item.etag)
            }
        }
        .task {
            await loadData()
            // ????
        }
    }
    
    func loadData() async {
        guard let url = URL(string: "https://www.googleapis.com/books/v1/volumes?q=flowers+inauthor:keyes") else {
            print("Invalid URL")
            return
        }
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
                results = decodedResponse.results
            }
        } catch {
            print("Invalid data")
        }
    }
}

如前所述,此代码已使用 Itunes API 进行测试,并且运行完美。我不确定是什么导致了这个问题或什么可以解决它。我会在这边继续寻找和练习。

谢谢!

您出现空白屏幕的原因是您的 ResponseResult 结构与您从中获得的 json 数据不匹配 api。仔细查看 json 数据,您会发现差异。尝试这样的事情:

struct Response: Codable {
    let items: [Result]  // <--- here
}

struct Result: Codable, Identifiable {  // <--- here
    var id: String      // <--- here
    var etag: String
}

struct ContentView: View {
    @State private var results = [Result]()
    
    var body: some View {
        List(results) { item in  // <--- here
            VStack(alignment: .leading) {
                Text(item.etag)
            }
        }
        .task {
            await loadData()
        }
    }
    
    func loadData() async {
         guard let url = URL(string: "https://www.googleapis.com/books/v1/volumes?q=flowers+inauthor:keyes") else {
             print("Invalid URL")
             return
         }
         do {
             let (data, _) = try await URLSession.shared.data(from: url)
             if let decodedResponse = try? JSONDecoder().decode(Response.self, from: data) {
                 results = decodedResponse.items  // <--- here
             }
         } catch {
             print("Invalid data")
         }
     }
    
}