How do I make an HTTP request in Swift?

前端 未结 20 1073
不知归路
不知归路 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:48

    A simple Swift 2.0 approach to making a HTTP GET request

    The HTTP request is asynchronous so you need a way to get the returned value from the HTTP Request. This approach uses Notifiers and is spread over two classes.

    The example is to check the username and password for an identifier token using the website http://www.example.com/handler.php?do=CheckUserJson&json= That is the file is called handler.php and has a switch statement on the do parameter to get a RESTful approach.

    In the viewDidLoad we setup the NotifierObserver, set up the json and make the call to the getHTTPRequest function. It will return to the function checkedUsernameAndPassword with the returned parameter from the http request.

    override func viewDidLoad() {
        super.viewDidLoad()
        // setup the Notification observer to catch the result of check username and password
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "checkedUsernameAndPassword:", name: CHECK_USERNAME_AND_PASSWORD, object: nil)        
        let username = GlobalVariables.USER_NAME
        let password = GlobalVariables.PASSWORD
        // check username and password
        if let jsonString = Utility.checkUsernameAndPasswordJson(username, password:password){
            print("json string returned = \(jsonString)")
            let url = CHECKUSERJSON+jsonString
            // CHECKUSERJSON = http://www.example.com/handler.php?do=CheckUserJson&json=
            // jsonString = {\"username\":\"demo\",\"password\":\"demo\"}"
            // the php script handles a json request and returns a string identifier           
            Utility.getHTTPRequest(url,notifierId: CHECK_USERNAME_AND_PASSWORD)
            // the returned identifier is sent to the checkedUsernaeAndPassword function when it becomes availabel.
        }
    }
    

    There are two static functions in Utility.swift first to encode the json and then to do the HTTP call.

        static func checkUsernameAndPasswordJson(username: String, password: String) -> String?{
        let para:NSMutableDictionary = NSMutableDictionary()
            para.setValue("demo", forKey: "username")
            para.setValue("demo", forKey: "password")
        let jsonData: NSData
        do{
            jsonData = try NSJSONSerialization.dataWithJSONObject(para, options: NSJSONWritingOptions())
            let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
            return jsonString
        } catch _ {
            print ("UH OOO")
            return nil
        }
    }
    

    and the Http request

        static func getHTTPRequest (url:String , notifierId: String) -> Void{
        let urlString = url
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil)
        let safeURL = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
        if let url = NSURL(string: safeURL){
            let request  = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "GET"
            request.timeoutInterval = 60
            let taskData = session.dataTaskWithRequest(request, completionHandler: {
                (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
                if (data != nil) {
                    let result = NSString(data: data! , encoding: NSUTF8StringEncoding)
                    sendNotification (notifierId, message: String(result), num: 0)
                }else{
                      sendNotification (notifierId, message: String(UTF8String: nil), num: -1)                    }
            })
        taskData.resume()
        }else{
            print("bad urlString = \(urlString)")
        }
    }
    

    The sendNotification function completes the circle. Notice that in teh Observer there is a ":" at the end of the selector string. This allows the notification to carry a payload in userInfo. I give this a String and an Int.

        static func sendNotification (key: String, message:String?, num: Int?){
        NSNotificationCenter.defaultCenter().postNotificationName(
            key,
            object: nil,
            userInfo:   (["message": message!,
                          "num": "\(num!)"])
        )
    }
    

    Note that using HTTP is oldFashioned, prefer HTTPS see How do I load an HTTP URL with App Transport Security enabled in iOS 9?

提交回复
热议问题