swifthttpsession

Returning response data from HttpSession post


I created an external HttpPOST.swift file for handling http requests easy. It works great, but when i try to pass the response data to a dictionary, i get an error:

Cannot assign value of type 'Response' to type '[String : Any]'

Can you tell me why? Thanks!

HttpPOST.swift

import UIKit
public var asd = Dictionary<String, Any>()
func apiCall(){
    
    guard let url = URL(string: "http://192.168.1.71:3000/user/login")else{
        return
    }
    
    var request = URLRequest(url: url)
    // method, body, headers
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let body: [String: AnyHashable] = [
        "username": "Alms",
        "password": "asd"
    ]
    request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
    
    // make rqs
    let task = URLSession.shared.dataTask(with: request){ data, response, error in
        guard let data = data,error == nil else {
            return
        }
        
        do {
            let response = try JSONDecoder().decode(Response.self, from: data)
            asd = response;
            print("SUCCESS: \(response)")
        }
        
        catch {
            print(error)
        }
        
    }
    
    task.resume()
}

struct Response: Codable {
    var usernameError: String?;
    var passwordError: String?;
    var logOk: Bool?;
    var token: String?;
}

Solution

  • Corrected code:

    import UIKit
    func apiCall(url: String, body: Dictionary<String, AnyHashable>, completion: @escaping (Response) -> Void){
        
        guard let url = URL(string: "http://192.168.1.71:3000/user/login")else{
            return
        }
        
        var request = URLRequest(url: url)
        // method, body, headers
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        let body: [String: AnyHashable] = body
        request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
        
        // make rqs
        let task = URLSession.shared.dataTask(with: request){ data, response, error in
            guard let data = data,error == nil else {
                return
            }
            
            do {
                let response = try JSONDecoder().decode(Response.self, from: data)
                completion(response)
            }
            
            catch {
                print(error)
            }
            
        }
        
        task.resume()
    }
    
    struct Response: Codable {
        var usernameError: String?;
        var passwordError: String?;
        var logOk: Bool?;
        var token: String?;
    }