How do I make an HTTP request in Swift?

前端 未结 20 1354
不知归路
不知归路 2020-11-22 05:10

I read The Programming Language Swift by Apple in iBooks, but cannot figure out how to make an HTTP request (something like cURL) in Swift. Do I need to import Obj-C classes

20条回答
  •  一整个雨季
    2020-11-22 05:52

    In Swift 4.1 and Xcode 9.4.1.

    JSON POST approach example. To check internet connection add Reachability.h & .m files from https://developer.apple.com/library/archive/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2

    func yourFunctionName {
        //Check internet connection
        let networkReachability = Reachability.forInternetConnection()
        let networkStatus:Int = (networkReachability?.currentReachabilityStatus())!.rawValue
        print(networkStatus)
        if networkStatus == NotReachable.rawValue {
            let msg = SharedClass.sharedInstance.noNetMsg//Message
            //Call alert from shared class
            SharedClass.sharedInstance.alert(view: self, title: "", message: msg)
        } else {
            //Call spinner from shared class
            SharedClass.sharedInstance.activityIndicator(view: self.view)//Play spinner
    
            let parameters = "Your parameters here"
            var request = URLRequest(url: URL(string: url)!)
    
            request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            request.httpMethod = "POST"
    
            print("URL : \(request)")
    
            request.httpBody = parameters.data(using: .utf8)
    
            let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error
                //Stop spinner
                SharedClass.sharedInstance.stopActivityIndicator() //Stop spinner
                //Print error in alert
                SharedClass.sharedInstance.alert(view: self, title: "", message: "\(String(describing: error!.localizedDescription))")
                return
                }
    
                SharedClass.sharedInstance.stopActivityIndicator() //Stop spinner
    
                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
                    print("statusCode should be 200, but is \(httpStatus.statusCode)")
                    print("response = \(String(describing: response))")
                }
    
                do {
                    let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject]
                    print(response!)
                    //Your code here                    
                } catch let error as NSError {
                    print(error)
                }
            }
    
            task.resume()
    
        }
    
    }
    

    If you have interest to use this function in SharedClass

    //My shared class
    import UIKit
    class SharedClass: NSObject {
    
    static let sharedInstance = SharedClass()
    
    func postRequestFunction(apiName: String , parameters: String, onCompletion: @escaping (_ success: Bool, _ error: Error?, _ result: [String: Any]?)->()) {
    
        var URL =  "your URL here/index.php/***?"
    
        URL = URL.replacingOccurrences(of: "***", with: apiName)
    
        var request = URLRequest(url: URL(string: URL)!)
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST"
        print("shared URL : \(request)")
        request.httpBody = parameters.data(using: .utf8)
    
        var returnRes:[String:Any] = [:]
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
    
            if let error = error {
                onCompletion(false, error, nil)
            } else {
                guard let data = data else {
                    onCompletion(false, error, nil)
                    return
                }
    
                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 {
                    do {
                       returnRes = try JSONSerialization.jsonObject(with: data, options: []) as! [String : Any]
                        onCompletion(true, nil, returnRes)
    
                    } catch let error as NSError {
                       onCompletion(false, error, nil)
                    }
                } else {
                    onCompletion(false, error, nil)
                }
            }
        }
        task.resume()
    }
    
    
    private override init() {
    
    }
    

    And finally call this function like this....

    SharedClass.sharedInstance.postRequestFunction(apiName: "Your API name", parameters: parameters) { (success, error, result) in
        print(result!)
        if success {
            //Your code here
        } else {
            print(error?.localizedDescription ?? "")
        }
    }
    

提交回复
热议问题