Post 方法通用可编码 API 响应无法在 swift 中正确实现

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

我创建了 APINetworkManagerAll,在这里我创建了 serviceCall 并在 viewcontroller 中调用它。这里 postGenericCall2() 被调用,响应也来了,但是我给定的

param
值没有来,而是说 nil 为什么?我在 postmn 中传递相同的值然后响应正常吗?我哪里错了?请指导我。

struct RequestObjectAll {
var params: [String: Any]? = nil
var method: HTTPMethod
var urlPath: String
var isTokenNeeded: Bool
var isLoaderNeed: Bool = false
var isErrorNeed: Bool = false
var vc: UIViewController?
}

class APINetworkManagerAll: NSObject {
static let sharedInstance = APINetworkManagerAll()

fileprivate override init() {
    super.init()
}

func serviceCall<T: Decodable>(requestObject: RequestObjectAll, completion: @escaping (Result<T, Error>) -> Void) {
    if requestObject.isLoaderNeed {
        requestObject.vc?.showLoader()
    }
    
    guard let url = URL(string: requestObject.urlPath) else {
        if requestObject.isLoaderNeed {
            requestObject.vc?.hideLoader()
        }
        completion(.failure(NetworkError.invalidURL))
        return
    }
    
    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = requestObject.method.rawValue
    
    guard let httpBody = try? JSONSerialization.data(withJSONObject: requestObject.params ?? ["" : ""], options: []) else {
                    return
                }
    urlRequest.httpBody = httpBody
    
    let task = URLSession.shared.dataTask(with: urlRequest) { data, _, error in
        if requestObject.isLoaderNeed {
            requestObject.vc?.hideLoader()
        }
        
        if let error = error {
            completion(.failure(error))
            return
        }
        
        if let data = data {
            do {
                let response = try JSONDecoder().decode(T.self, from: data)
                completion(.success(response))
            } catch {
                completion(.failure(error))
            }
        } else {
            let error = NSError(domain: "YourDomain", code: 0, userInfo: [NSLocalizedDescriptionKey: "No data received"])
            completion(.failure(error))
        }
    }
    task.resume()
}
}


func postGenericCall2(){
    
    let param = ["name": "john",
                 "job": "AAA"
    ] 
    
    let requestObject = RequestObjectAll(
        params: param,
        method: .post,
        urlPath: "https://reqres.in/api/users",
        isTokenNeeded: false,
        isLoaderNeed: true,
        vc: self
    )
    APINetworkManagerAll.sharedInstance.serviceCall(requestObject: requestObject) { (result: Result<PostGenModelSmall, Error>) in
        switch result {
        case .success(let response):
            // Handle a successful response
            print("result of post service call.....: \(response)")
            
        case .failure(let error):
            // Handle the error
            print("Error decoding JSON: \(error)")
        }
    }
    
}

struct PostGenModelSmall: Codable {
let name: String
let job: String
let id: String
let createdAt: String
}

错误:

解码 JSON 时出错:keyNotFound(CodingKeys(stringValue: "name", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "没有与键关联的值 CodingKeys(stringValue: "name", intValue: nil) )(“名称”)。”,underlyingError:nil))

json swift web-services parameters codable
© www.soinside.com 2019 - 2024. All rights reserved.