我正在尝试使用 alamofire 从 CoinMarketCap API 获取最新的列表加密数据。网络请求返回成功但响应数据无法填满。有什么解决方案适合我吗?
这是我在 ViewModel 中的请求函数:
final class AllCurrenciesViewModel: AllCurrenciesViewModelProtocol {
public var didSuccess: ()->() = {}
public var didFailure: (String)->() = {_ in}
private var currenciesData: CurrencyResponse?
func requestAllCurrencies() {
LastestCurrenciesRequest(start: 1, limit: 1, sort: "market_cap", currencyType: "all").request { [weak self] response in
guard let self = self else { return }
self.currenciesData = response?.entity
self.didSuccess()
} failure: { (error) in
self.didFailure(error.message ?? "")
}
}
}
这是我的请求管理器:
private static func createRequest(_ request: RequestDelegate) -> DataRequest {
print("Path: \(request.path)")
print("RequestMethod: \(request.method.rawValue)" + " || " + "RequestParameters:", (request.parameters ?? "nil"))
let request = AF.request(apiUrl+request.path, method: request.method, parameters: request.parameters, encoding: request.enconding!, headers: HTTPHeaders(generateHeader() ?? ["":""]))
request.validate()
request.responseData { (response) in
if let value = response.data {
debugPrint("REQUEST: \(response.request)")
if let json = String(data: value, encoding: .utf8) {
let cleanJson = json.replacingOccurrences(of: "\\/", with: "/")
print("Data:" + cleanJson)
}
}
}
return request
}
static func request<T: Codable>(_ request: RequestDelegate, success: @escaping ObjectClosure<T>, failure: @escaping ErrorClosure) {
let request = createRequest(request)
request.responseData { (response) in
switch response.result {
case .success:
debugPrint("REQUEST: \(response.request)")
if let data = response.data, let model = ResponseObjectModel<T>.decode(data) {
success(model)
}
else if let data = response.data {
if let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
let isSuccess = jsonResponse["error_message"]
if (isSuccess ?? false) as! Bool{
success(nil)
} else {
handleFailure(response: response, failure: failure)
}
}
} else {
handleFailure(response: response, failure: failure)
}
case .failure:
handleFailure(response: response, failure: failure)
}
}
}
这是我的 ResponseObjectModel:
class ResponseObjectModel<T: Codable>: BaseResponseModel {
var entity: T?
enum CodingKeys: String, CodingKey {
case entity = "data"
}
required init(from decoder: Decoder) throws {
do {
let container = try decoder.container(keyedBy: CodingKeys.self)
entity = try container.decode(T.self, forKey: .entity)
try super.init(from: decoder)
} catch {
print("error decoding entity: \(error)")
throw error
}
}
}
我在解码实体时遇到错误: typeMismatch(Swift.Dictionary
这是 json 模型:
{
"status": {
"timestamp": "2023-11-30T16:18:17.277Z",
"error_code": 0,
"error_message": null,
"elapsed": 35,
"credit_count": 1,
"notice": null,
"total_count": 8848
},
"data": [
{
"id": 1,
"name": "Bitcoin",
"symbol": "BTC",
"slug": "bitcoin",
"num_market_pairs": 10577,
"date_added": "2010-07-13T00:00:00.000Z",
"tags": [
"mineable",
"pow",
"sha-256",
"store-of-value",
"state-channel",
"coinbase-ventures-portfolio",
],
"max_supply": 21000000,
"circulating_supply": 19557106,
"total_supply": 19557106,
"infinite_supply": false,
"platform": null,
"cmc_rank": 1,
"self_reported_circulating_supply": null,
"self_reported_market_cap": null,
"tvl_ratio": null,
"last_updated": "2023-11-30T16:17:00.000Z",
"quote": {
"USD": {
"price": 37615.098096097085,
"volume_24h": 19255617190.253216,
"volume_change_24h": -26.5108,
"percent_change_1h": -0.22835089,
"percent_change_24h": -0.23443231,
"percent_change_7d": 1.34443149,
"percent_change_30d": 9.61958301,
"percent_change_60d": 38.54515832,
"percent_change_90d": 45.95563552,
"market_cap": 735642460665.7689,
"market_cap_dominance": 51.8664,
"fully_diluted_market_cap": 789917060018.04,
"tvl": null,
"last_updated": "2023-11-30T16:17:00.000Z"
}
}
}
]
}
这是我的 BaseResponseModel:
类 BaseResponseModel:可编码 {
var status: CurrencyStatus?
var data: [CurrencyResponse?]
enum CodingKeys: String, CodingKey {
case status
case data
}
}
struct CurrencyStatus: Codable {
var timeStamp: String?
var errorCode: Int?
var errorMessage: String?
var elapsed: Int?
var creditCount: Int?
var notice: String?
enum CodingKeys: String, CodingKey {
case timeStamp = "timestamp"
case errorCode = "error_code"
case errorMessage = "error_message"
case elapsed
case creditCount = "credit_count"
case notice
}
}
struct CurrencyResponse: Codable {
var id: Int?
var name: String?
var symbol: String?
var slug: String?
var cmcRank: Int?
var numMarketPairs: Int?
var circulatingSupply: Int?
var totalSupply: Int?
var maxSupply: Int?
var queto: Quote?
var lastUpdated: String?
var dateAdded: String?
var tags: [String?]
}
当我发现我无法将我的资产从公司转移出来时,我感到非常伤心。 我失去了很多,真的很沮丧,我不得不寻求帮助,直到我被引导到奥利维亚·洛佩兹夫人和他的康复公司和基金会,帮助我追回了我失去的所有钱。这真的很值得。我很乐意与任何人分享我的经验,您也可以与他联系以寻求帮助和协助,以实现成功且安全的投资,而不会造成任何资金损失。给她发邮件 oliviatrader44@gmail com WhatsApp +1 (423) 248-2140