fix http api
This commit is contained in:
parent
8240aa9927
commit
42eca56b59
@ -195,6 +195,8 @@
|
||||
);
|
||||
mainGroup = C85F58B72D64D10F00D761E9;
|
||||
minimizedProjectReferenceProxies = 1;
|
||||
packageReferences = (
|
||||
);
|
||||
preferredProjectObjectVersion = 77;
|
||||
productRefGroup = C85F58C12D64D10F00D761E9 /* Products */;
|
||||
projectDirPath = "";
|
||||
|
||||
64
dimensionhub/Core/API.swift
Normal file
64
dimensionhub/Core/API.swift
Normal 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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -8,8 +8,6 @@
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
let url: String = "https://n.sinaimg.cn/sinacn10113/332/w1024h1708/20190806/73d1-iatixpm8624905.jpg"
|
||||
|
||||
struct IndexView: View {
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
@Query private var items: [Item]
|
||||
@ -20,6 +18,13 @@ struct IndexView: View {
|
||||
let name: String
|
||||
let thumb: String
|
||||
let numName: String
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case id = "id"
|
||||
case name = "name"
|
||||
case thumb = "thumb"
|
||||
case numName = "num_name"
|
||||
}
|
||||
}
|
||||
|
||||
let title: String
|
||||
@ -33,48 +38,19 @@ struct IndexView: View {
|
||||
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 {
|
||||
case lable(String)
|
||||
case item(UpdateDramaItem)
|
||||
}
|
||||
|
||||
@State var showUpdateDramas: [UpdateDramaShowItem] = Self.yes(updateDramas: [
|
||||
.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月番"),
|
||||
])
|
||||
struct IndexResponse: Codable {
|
||||
let updateDramas: [UpdateDramaItem]
|
||||
let dramas: [DramaItem]
|
||||
}
|
||||
|
||||
@State var dramas: [DramaItem] = []
|
||||
@State var showUpdateDramas: [UpdateDramaShowItem] = []
|
||||
@State var isLoading: Bool = false
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .center) {
|
||||
@ -119,19 +95,31 @@ struct IndexView: View {
|
||||
}
|
||||
}
|
||||
.task {
|
||||
let groups = Dictionary(grouping: self.updateDramas) {$0.datetime}
|
||||
var updateItems: [UpdateDramaShowItem] = []
|
||||
groups.forEach { (key, items) in
|
||||
updateItems.append(.lable(key))
|
||||
items.forEach { item in
|
||||
updateItems.append(.item(item))
|
||||
let response = await API.getIndexData(as: IndexResponse.self)
|
||||
switch response {
|
||||
case .error(let code, let message):
|
||||
print(code)
|
||||
print(message)
|
||||
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() {
|
||||
Loading…
x
Reference in New Issue
Block a user