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 进行测试,并且运行完美。我不确定是什么导致了这个问题或什么可以解决它。我会在这边继续寻找和练习。
谢谢!
您出现空白屏幕的原因是您的 Response
和 Result
结构与您从中获得的 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")
}
}
}
大家好
所以我是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 进行测试,并且运行完美。我不确定是什么导致了这个问题或什么可以解决它。我会在这边继续寻找和练习。
谢谢!
您出现空白屏幕的原因是您的 Response
和 Result
结构与您从中获得的 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")
}
}
}