Postman GET 返回成功,但 SwiftUI App GET 返回解码错误

问题描述 投票:0回答:1

我正在运行一个蒸气服务器。除了 getOrders 之外,我的应用程序网络请求都运行良好。在 Postman 上运行请求时,它会成功返回。谁能看到邮递员做了什么才能得到我未能做到的回复?

这是我当前遇到的错误:

typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "dateOrdered", intValue: nil)], debugDescription: "Expected to decode Double but found a string instead.", underlyingError: nil))

这是我的网络请求代码:

func getOrders() async throws -> [Order] {
        
        let session = URLSession.shared
        var request = URLRequest(url: URL(string: "\(API.url)/orders/")!)
        
        request.httpMethod = "GET"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("Bearer \(token!.value)", forHTTPHeaderField: "Authorization")
            
            // Make the request
        let (data, response) = try await session.data(for: request)
        print(data)
        
        print(response)
            // Ensure we had a good response (status 200)
            guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                throw GetOrdersError.unableToGetOrders
            }
        print(httpResponse.statusCode)
            
        let decoder = JSONDecoder()
        let orders = try decoder.decode([Order].self, from: data)
        
        print(orders)
        return orders
    }

这是我的应用程序中的订单模型:

struct Order: Identifiable, Codable {
    
    var id: UUID?
    var residentID: UUID
    var house: String
    var dateOrdered: Date
    var allPurposeCleaner: Bool
    var airFreshener: Bool
    var laundryPods: Bool
    var dishPods: Bool
    var dishSoap: Bool
    var windex: Bool
    var cloroxWipes: Bool
    var paperTowels: Bool
    var toiletPaper: Bool
    var toiletBowlCleaner: Bool
    var thrift: Bool
    var swifferPads: Bool
    var trashBags: Bool
    var isOrderCompleted: Bool
    
    static let houses = ["Wolf Pack", "Crow House", "Raptor House", "Lemur House", "Orca Pod", "Gorilla House", "Bison House", "Lion's Den"]
    
    
    init(id: UUID?, residentID: UUID, house: String, dateOrdered: Date, allPurposeCleaner: Bool, airFreshener: Bool, laundryPods: Bool, dishPods: Bool, dishSoap: Bool, windex: Bool, cloroxWipes: Bool, paperTowels: Bool, toiletPaper: Bool, toiletBowlCleaner: Bool, thrift: Bool, swifferPads: Bool, trashBags: Bool, isOrderCompleted: Bool) {
        
        self.id = id
        self.residentID = residentID
        self.house = house
        self.dateOrdered = dateOrdered
        self.allPurposeCleaner = allPurposeCleaner
        self.airFreshener = airFreshener
        self.laundryPods = laundryPods
        self.dishPods = dishPods
        self.dishSoap = dishSoap
        self.windex = windex
        self.cloroxWipes = cloroxWipes
        self.paperTowels = paperTowels
        self.toiletPaper = toiletPaper
        self.toiletBowlCleaner = toiletBowlCleaner
        self.thrift = thrift
        self.swifferPads = swifferPads
        self.trashBags = trashBags
        self.isOrderCompleted = isOrderCompleted
    }
}

这是我服务器上的订单模型:

import Foundation
import Vapor
import Fluent

final class Order: Model, Content {
    
    init() {
    }
    
    static var schema: String = "orders"
    
    init(id: UUID, residentID: UUID, house: String, dateOrdered: Date, allPurposeCleaner: Bool, airFreshener: Bool, laundryPods: Bool, dishPods: Bool, dishSoap: Bool, windex: Bool, cloroxWipes: Bool, paperTowels: Bool, toiletPaper: Bool, toiletBowlCleaner: Bool, thrift: Bool, swifferPads: Bool, trashBags: Bool, isOrderCompleted: Bool) {
            
        self.id = id
        self.residentID = residentID
        self.house = house
        self.dateOrdered = dateOrdered
        self.allPurposeCleaner = allPurposeCleaner
        self.airFreshener = airFreshener
        self.laundryPods = laundryPods
        self.dishPods = dishPods
        self.dishSoap = dishSoap
        self.windex = windex
        self.cloroxWipes = cloroxWipes
        self.paperTowels = paperTowels
        self.toiletPaper = toiletPaper
        self.toiletBowlCleaner = toiletBowlCleaner
        self.thrift = thrift
        self.swifferPads = swifferPads
        self.trashBags = trashBags
        self.isOrderCompleted = isOrderCompleted
    }
    
    @ID(key: .id)
    var id: UUID?
    
    @Field(key: "residentID")
    var residentID: UUID
    
    @Field(key: "house")
    var house: String
    
    @Field(key: "dateOrdered")
    var dateOrdered: Date
    
    @Field(key: "allPurposeCleaner")
    var allPurposeCleaner: Bool
    
    @Field(key: "airFreshener")
    var airFreshener: Bool
    
    @Field(key: "laundryPods")
    var laundryPods: Bool
    
    @Field(key: "dishPods")
    var dishPods: Bool
    
    @Field(key: "dishSoap")
    var dishSoap: Bool
    
    @Field(key: "windex")
    var windex: Bool
    
    @Field(key: "cloroxWipes")
    var cloroxWipes: Bool
    
    @Field(key: "paperTowels")
    var paperTowels: Bool
    
    @Field(key: "toiletPaper")
    var toiletPaper: Bool
    
    @Field(key: "toiletBowlCleaner")
    var toiletBowlCleaner: Bool
    
    @Field(key: "thrift")
    var thrift: Bool
    
    @Field(key: "swifferPads")
    var swifferPads: Bool
    
    @Field(key: "trashBags")
    var trashBags: Bool
    
    @Field(key: "isOrderCompleted")
    var isOrderCompleted: Bool
    
}

这是邮递员工作正常:

swift swiftui server vapor
1个回答
0
投票

使用特定的日期解码器尝试此方法,如果您的日期不是 iso8601,请进行调整:

  let decoder = JSONDecoder()
  decoder.dateDecodingStrategy = .iso8601
  let orders = try decoder.decode([Order].self, from: data)

要使用您自己的日期格式,请使用

decoder.dateDecodingStrategy = .formatted(formatter)
© www.soinside.com 2019 - 2024. All rights reserved.