fix http api

This commit is contained in:
anlicheng 2025-02-19 22:13:06 +08:00
parent 8240aa9927
commit 42eca56b59
3 changed files with 103 additions and 49 deletions

View File

@ -195,6 +195,8 @@
); );
mainGroup = C85F58B72D64D10F00D761E9; mainGroup = C85F58B72D64D10F00D761E9;
minimizedProjectReferenceProxies = 1; minimizedProjectReferenceProxies = 1;
packageReferences = (
);
preferredProjectObjectVersion = 77; preferredProjectObjectVersion = 77;
productRefGroup = C85F58C12D64D10F00D761E9 /* Products */; productRefGroup = C85F58C12D64D10F00D761E9 /* Products */;
projectDirPath = ""; projectDirPath = "";

View File

@ -0,0 +1,64 @@
//
// Api.swift
// dimensionhub
//
// Created by on 2025/2/19.
//
import Foundation
struct API {
//
struct APIErrorResponse: Codable {
struct APIError: Codable {
let code: Int32
let message: String
}
let error: APIError
}
//
struct APISuccessResponse<T: Codable>: Codable {
let result: T
}
enum APIResponse<T: Codable> {
case result(T)
case error(Int32, String)
}
static let url = "http://localhost:18085/api/dimensionhub/"
static func getIndexData<T: Codable>(as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: url + "index")!)
return await doRequest(request: request, as: T.self)
}
static func loadMoreUpdateDramas<T: Codable>(as: T.Type) async -> APIResponse<T> {
let request = URLRequest(url: URL(string: url + "load_more_dramas")!)
return await doRequest(request: request, as: T.self)
}
// http
private static func doRequest<T: Codable>(request: URLRequest, as: T.Type) async -> APIResponse<T> {
do {
let (data, response) = try await URLSession.shared.data(for: request)
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
return .error(-1, "http status error")
}
do {
let result = try JSONDecoder().decode(APISuccessResponse<T>.self, from: data)
return .result(result.result)
} catch {
let apiError = try JSONDecoder().decode(APIErrorResponse.self, from: data)
return .error(apiError.error.code, apiError.error.message)
}
} catch let err {
return .error(-1, err.localizedDescription)
}
}
}

View File

@ -8,8 +8,6 @@
import SwiftUI import SwiftUI
import SwiftData import SwiftData
let url: String = "https://n.sinaimg.cn/sinacn10113/332/w1024h1708/20190806/73d1-iatixpm8624905.jpg"
struct IndexView: View { struct IndexView: View {
@Environment(\.modelContext) private var modelContext @Environment(\.modelContext) private var modelContext
@Query private var items: [Item] @Query private var items: [Item]
@ -20,6 +18,13 @@ struct IndexView: View {
let name: String let name: String
let thumb: String let thumb: String
let numName: String let numName: String
enum CodingKeys: String, CodingKey {
case id = "id"
case name = "name"
case thumb = "thumb"
case numName = "num_name"
}
} }
let title: String let title: String
@ -33,48 +38,19 @@ struct IndexView: View {
let datetime: String let datetime: String
} }
@State var dramas: [DramaItem] = [
.init(title: "夏目友人帐 陆", episodes: [
.init(id: 1, name: "西村与北本", thumb: url, numName: "第6话"),
.init(id: 2, name: "西村与北本", thumb: url, numName: "第5话"),
.init(id: 3, name: "西村与北本", thumb: url, numName: "第4话"),
.init(id: 4, name: "西村与北本", thumb: url, numName: "第4话"),
.init(id: 5, name: "西村与北本", thumb: url, numName: "第4话"),
]),
.init(title: "吹响吧! 上低音号", episodes: [
.init(id: 1, name: "欢迎进入高中", thumb: url, numName: "第6话"),
.init(id: 2, name: "拜托了上低音...", thumb: url, numName: "第5话"),
.init(id: 3, name: "吹奏乐部活动...", thumb: url, numName: "第4话"),
.init(id: 4, name: "吹奏乐部活动...", thumb: url, numName: "第4话"),
.init(id: 5, name: "吹奏乐部活动...", thumb: url, numName: "第4话"),
])
]
let updateDramas: [UpdateDramaItem] = [
.init(name: "拜托了上", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
.init(name: "拜托了上1", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
.init(name: "拜托了上2", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
.init(name: "拜托了上3", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
.init(name: "拜托了上4", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
.init(name: "拜托了上5", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"),
.init(name: "拜托了上6", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"),
]
enum UpdateDramaShowItem { enum UpdateDramaShowItem {
case lable(String) case lable(String)
case item(UpdateDramaItem) case item(UpdateDramaItem)
} }
@State var showUpdateDramas: [UpdateDramaShowItem] = Self.yes(updateDramas: [ struct IndexResponse: Codable {
.init(name: "拜托了上", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), let updateDramas: [UpdateDramaItem]
.init(name: "拜托了上1", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), let dramas: [DramaItem]
.init(name: "拜托了上2", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), }
.init(name: "拜托了上3", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"),
.init(name: "拜托了上4", thumb: url, desc: "更新到第5话", datetime: "2017年4月番"), @State var dramas: [DramaItem] = []
.init(name: "拜托了上5", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"), @State var showUpdateDramas: [UpdateDramaShowItem] = []
.init(name: "拜托了上6", thumb: url, desc: "更新到第5话", datetime: "2017年5月番"), @State var isLoading: Bool = false
])
var body: some View { var body: some View {
VStack(alignment: .center) { VStack(alignment: .center) {
@ -119,19 +95,31 @@ struct IndexView: View {
} }
} }
.task { .task {
let groups = Dictionary(grouping: self.updateDramas) {$0.datetime} let response = await API.getIndexData(as: IndexResponse.self)
var updateItems: [UpdateDramaShowItem] = [] switch response {
groups.forEach { (key, items) in case .error(let code, let message):
updateItems.append(.lable(key)) print(code)
items.forEach { item in print(message)
updateItems.append(.item(item)) case .result(let result):
print(result)
self.dramas = result.dramas
self.showUpdateDramas = Self.yes(updateDramas: result.updateDramas)
} }
} }
self.showUpdateDramas = updateItems
NSLog("call me heere 11")
} }
private func loadMoreUpdateDramas() async {
// guard !self.isLoading else {
// return
// }
//
// self.isLoading = true
//
// if let data = await API.loadMoreUpdateDramas() {
// try! JSONDecoder().decode([UpdateDramaItem].self, from: data)
// }
} }
private func addItem() { private func addItem() {