|
5 | 5 | // Created by Ming Dai on 2021/11/8.
|
6 | 6 | //
|
7 | 7 |
|
8 |
| -import Foundation |
9 |
| -import Combine |
10 |
| - |
11 |
| -// MARK: - API Request Fundation |
12 |
| - |
13 |
| -protocol APIReqType { |
14 |
| - associatedtype Res: Decodable |
15 |
| - var path: String { get } |
16 |
| - var qItems: [URLQueryItem]? { get } |
17 |
| -} |
18 |
| - |
19 |
| -protocol APIVMable: ObservableObject { |
20 |
| - associatedtype ActionType |
21 |
| - func doing(_ somethinglike: ActionType) |
22 |
| -} |
23 |
| - |
24 |
| -protocol APISevType { |
25 |
| - func response<Request>(from req: Request) -> AnyPublisher<Request.Res, APISevError> where Request: APIReqType |
26 |
| -} |
27 |
| - |
28 |
| -final class APISev: APISevType { |
29 |
| - private let rootUrl: URL |
30 |
| - |
31 |
| - init(rootUrl: URL = URL(string: "https://api.github.com")!) { |
32 |
| - self.rootUrl = rootUrl |
33 |
| - } |
34 |
| - |
35 |
| - func response<Request>(from req: Request) -> AnyPublisher<Request.Res, APISevError> where Request : APIReqType { |
36 |
| - let path = URL(string: req.path, relativeTo: rootUrl)! |
37 |
| - var comp = URLComponents(url: path, resolvingAgainstBaseURL: true)! |
38 |
| - comp.queryItems = req.qItems |
39 |
| -// print(comp.url?.description ?? "url wrong") |
40 |
| - var req = URLRequest(url: comp.url!) |
41 |
| - |
42 |
| - // token 处理 |
43 |
| - // TODO: 支持 OAuth |
44 |
| - // TODO: 访问受限后会crash,异常待处理 |
45 |
| - var githubat = "" |
46 |
| - if SPC.gitHubAccessToken.isEmpty == true { |
47 |
| - githubat = SPC.githubAccessToken() |
48 |
| - } else { |
49 |
| - githubat = SPC.gitHubAccessToken |
50 |
| - } |
51 |
| - |
52 |
| - req.addValue("token \(githubat)", forHTTPHeaderField: "Authorization") |
53 |
| - |
54 |
| -// print(req.allHTTPHeaderFields!) |
55 |
| - let de = JSONDecoder() |
56 |
| - de.keyDecodingStrategy = .convertFromSnakeCase |
57 |
| - let sch = DispatchQueue(label: "GitHub API Queue", qos: .default, attributes: .concurrent) |
58 |
| - return URLSession.shared.dataTaskPublisher(for: req) |
59 |
| - .retry(3) |
60 |
| - .subscribe(on: sch) |
61 |
| - .receive(on: sch) |
62 |
| - .map { data, _ in |
63 |
| -// print(String(decoding: data, as: UTF8.self)) |
64 |
| -// print(res.description) |
65 |
| - // 打印api访问额度 |
66 |
| -// let hres = res as! HTTPURLResponse |
67 |
| -// print(hres.value(forHTTPHeaderField: "x-ratelimit-remaining") ?? "none") |
68 |
| - return data |
69 |
| - } |
70 |
| - .mapError { _ in |
71 |
| - APISevError.resError |
72 |
| - } |
73 |
| - .decode(type: Request.Res.self, decoder: de) |
74 |
| - .mapError { _ in |
75 |
| - APISevError.parseError |
76 |
| - } |
77 |
| - .receive(on: RunLoop.main) |
78 |
| - .eraseToAnyPublisher() |
79 |
| - } |
80 |
| -} |
81 |
| - |
82 |
| -enum APISevError: Error { |
83 |
| - case resError |
84 |
| - case parseError |
85 |
| - |
86 |
| - var message: String { |
87 |
| - switch self { |
88 |
| - case .resError: |
89 |
| - return "网络无法访问" |
90 |
| - case .parseError: |
91 |
| - return "网络出错" |
92 |
| - } |
93 |
| - } |
94 |
| -} |
| 8 | +//import Foundation |
| 9 | +//import Combine |
| 10 | +// |
| 11 | +//// MARK: - API Request Fundation |
| 12 | +// |
| 13 | +//protocol APIReqType { |
| 14 | +// associatedtype Res: Decodable |
| 15 | +// var path: String { get } |
| 16 | +// var qItems: [URLQueryItem]? { get } |
| 17 | +//} |
| 18 | +// |
| 19 | +//protocol APIVMable: ObservableObject { |
| 20 | +// associatedtype ActionType |
| 21 | +// func doing(_ somethinglike: ActionType) |
| 22 | +//} |
| 23 | +// |
| 24 | +//protocol APISevType { |
| 25 | +// func response<Request>(from req: Request) -> AnyPublisher<Request.Res, APISevError> where Request: APIReqType |
| 26 | +//} |
| 27 | +// |
| 28 | +//final class APISev: APISevType { |
| 29 | +// private let rootUrl: URL |
| 30 | +// |
| 31 | +// init(rootUrl: URL = URL(string: "https://api.github.com")!) { |
| 32 | +// self.rootUrl = rootUrl |
| 33 | +// } |
| 34 | +// |
| 35 | +// func response<Request>(from req: Request) -> AnyPublisher<Request.Res, APISevError> where Request : APIReqType { |
| 36 | +// let path = URL(string: req.path, relativeTo: rootUrl)! |
| 37 | +// var comp = URLComponents(url: path, resolvingAgainstBaseURL: true)! |
| 38 | +// comp.queryItems = req.qItems |
| 39 | +//// print(comp.url?.description ?? "url wrong") |
| 40 | +// var req = URLRequest(url: comp.url!) |
| 41 | +// |
| 42 | +// // token 处理 |
| 43 | +// // TODO: 支持 OAuth |
| 44 | +// // TODO: 访问受限后会crash,异常待处理 |
| 45 | +// var githubat = "" |
| 46 | +// if SPC.gitHubAccessToken.isEmpty == true { |
| 47 | +// githubat = SPC.githubAccessToken() |
| 48 | +// } else { |
| 49 | +// githubat = SPC.gitHubAccessToken |
| 50 | +// } |
| 51 | +// |
| 52 | +// req.addValue("token \(githubat)", forHTTPHeaderField: "Authorization") |
| 53 | +// |
| 54 | +//// print(req.allHTTPHeaderFields!) |
| 55 | +// let de = JSONDecoder() |
| 56 | +// de.keyDecodingStrategy = .convertFromSnakeCase |
| 57 | +// let sch = DispatchQueue(label: "GitHub API Queue", qos: .default, attributes: .concurrent) |
| 58 | +// return URLSession.shared.dataTaskPublisher(for: req) |
| 59 | +// .retry(3) |
| 60 | +// .subscribe(on: sch) |
| 61 | +// .receive(on: sch) |
| 62 | +// .map { data, _ in |
| 63 | +//// print(String(decoding: data, as: UTF8.self)) |
| 64 | +//// print(res.description) |
| 65 | +// // 打印api访问额度 |
| 66 | +//// let hres = res as! HTTPURLResponse |
| 67 | +//// print(hres.value(forHTTPHeaderField: "x-ratelimit-remaining") ?? "none") |
| 68 | +// return data |
| 69 | +// } |
| 70 | +// .mapError { _ in |
| 71 | +// APISevError.resError |
| 72 | +// } |
| 73 | +// .decode(type: Request.Res.self, decoder: de) |
| 74 | +// .mapError { _ in |
| 75 | +// APISevError.parseError |
| 76 | +// } |
| 77 | +// .receive(on: RunLoop.main) |
| 78 | +// .eraseToAnyPublisher() |
| 79 | +// } |
| 80 | +//} |
| 81 | +// |
| 82 | +//enum APISevError: Error { |
| 83 | +// case resError |
| 84 | +// case parseError |
| 85 | +// |
| 86 | +// var message: String { |
| 87 | +// switch self { |
| 88 | +// case .resError: |
| 89 | +// return "网络无法访问" |
| 90 | +// case .parseError: |
| 91 | +// return "网络出错" |
| 92 | +// } |
| 93 | +// } |
| 94 | +//} |
0 commit comments