首页 文章

如何在Swift中发出HTTP请求?

提问于
浏览
298

我在iBooks中阅读了Apple编程语言Swift,但无法弄清楚如何在Swift中创建一个http请求(类似于CURL) . 我是否需要导入Obj-C类或者我只需要导入默认库?或者是否无法基于本机swift代码发出HTTP请求?

16 回答

  • 444

    到目前为止,我正在使用这个人的包装器,效果很好https://github.com/daltoniam/swiftHTTP . 到目前为止没有大的leaky abstractions

    do {
            let opt = try HTTP.GET("https://google.com")
            opt.start { response in
                if let err = response.error {
                    print("error: \(err.localizedDescription)")
                    return //also notify app of failure as needed
                }
                print("opt finished: \(response.description)")
                //print("data is: \(response.data)") access the response of the data with response.data
            }
        } catch let error {
            print("got an error creating the request: \(error)")
        }
    
  • 1
    var post:NSString = "api=myposts&userid=\(uid)&page_no=0&limit_no=10"
    
        NSLog("PostData: %@",post);
    
        var url1:NSURL = NSURL(string: url)!
    
        var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!
    
        var postLength:NSString = String( postData.length )
    
        var request:NSMutableURLRequest = NSMutableURLRequest(URL: url1)
        request.HTTPMethod = "POST"
        request.HTTPBody = postData
        request.setValue(postLength, forHTTPHeaderField: "Content-Length")
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")
    
        var reponseError: NSError?
        var response: NSURLResponse?
    
        var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)
    
        if ( urlData != nil ) {
            let res = response as NSHTTPURLResponse!;
    
            NSLog("Response code: %ld", res.statusCode);
    
            if (res.statusCode >= 200 && res.statusCode < 300)
            {
                var responseData:NSString  = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!
    
                NSLog("Response ==> %@", responseData);
    
                var error: NSError?
    
                let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary
    
                let success:NSInteger = jsonData.valueForKey("error") as NSInteger
    
                //[jsonData[@"success"] integerValue];
    
                NSLog("Success: %ld", success);
    
                if(success == 0)
                {
                    NSLog("Login SUCCESS");
    
                    self.dataArr = jsonData.valueForKey("data") as NSMutableArray
                    self.table.reloadData()
    
                } else {
    
                    NSLog("Login failed1");
                    ZAActivityBar.showErrorWithStatus("error", forAction: "Action2")
                }
    
            } else {
    
                NSLog("Login failed2");
                ZAActivityBar.showErrorWithStatus("error", forAction: "Action2")
    
            }
        } else {
    
            NSLog("Login failed3");
            ZAActivityBar.showErrorWithStatus("error", forAction: "Action2")
    }
    

    它肯定会对你有所帮助

  • 20

    Swift 3 and above Data Request using URLSession API

    //create the url with NSURL
       let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")! //change the url
    
       //create the session object
       let session = URLSession.shared
    
       //now create the URLRequest object using the url object
       let request = URLRequest(url: url)
    
       //create dataTask using the session object to send data to the server
       let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    
           guard error == nil else {
               return
           }
    
           guard let data = data else {
               return
           }
    
          do {
             //create json object from data
             if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                print(json)
             }
          } catch let error {
            print(error.localizedDescription)
          }
       })
    
       task.resume()
    

    Swift 4, Decodable and Result enum

    //APPError enum which shows all possible errors
    enum APPError: Error {
        case networkError(Error)
        case dataNotFound
        case jsonParsingError(Error)
        case invalidStatusCode(Int)
    }
    
    //Result enum to show success or failure
    enum Result<T> {
        case success(T)
        case failure(APPError)
    }
    
    //dataRequest which sends request to given URL and convert to Decodable Object
    func dataRequest<T: Decodable>(with url: String, objectType: T.Type, completion: @escaping (Result<T>) -> Void) {
    
        //create the url with NSURL
        let dataURL = URL(string: url)! //change the url
    
        //create the session object
        let session = URLSession.shared
    
        //now create the URLRequest object using the url object
        let request = URLRequest(url: dataURL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60)
    
        //create dataTask using the session object to send data to the server
        let task = session.dataTask(with: request, completionHandler: { data, response, error in
    
            guard error == nil else {
                completion(Result.failure(AppError.networkError(error!)))
                return
            }
    
            guard let data = data else {
                completion(Result.failure(APPError.dataNotFound))
                return
            }
    
            do {
                //create decodable object from data
                let decodedObject = try JSONDecoder().decode(objectType.self, from: data)
                completion(Result.success(decodedObject))
            } catch let error {
                completion(Result.failure(APPError.jsonParsingError(error as! DecodingError)))
            }
        })
    
        task.resume()
    }
    

    example:

    //如果我们想从占位符API获取todo,那么我们定义ToDo结构并调用dataRequest并传递“https://jsonplaceholder.typicode.com/todos/1”字符串url .

    struct ToDo: Decodable {
        let id: Int
        let userId: Int
        let title: String
        let completed: Bool
    
    }
    
    dataRequest(with: "https://jsonplaceholder.typicode.com/todos/1", objectType: ToDo.self) { (result: Result) in
        switch result {
        case .success(let object):
            print(object)
        case .failure(let error):
            print(error)
        }
    }
    

    //这打印结果:

    ToDo(id: 1, userId: 1, title: "delectus aut autem", completed: false)
    
  • 0

    我在点击登录按钮时调用json

    @IBAction func loginClicked(sender : AnyObject) {
    
        var request = NSMutableURLRequest(URL: NSURL(string: kLoginURL)) // Here, kLogin contains the Login API.
    
        var session = NSURLSession.sharedSession()
    
        request.HTTPMethod = "POST"
    
        var err: NSError?
        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(self.criteriaDic(), options: nil, error: &err) // This Line fills the web service with required parameters.
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
    
        var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
            var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
            var err1: NSError?
            var json2 = NSJSONSerialization.JSONObjectWithData(strData.dataUsingEncoding(NSUTF8StringEncoding), options: .MutableLeaves, error:&err1 ) as NSDictionary
    
            println("json2 :\(json2)")
    
            if(err) {
                println(err!.localizedDescription)
            }
            else {
                var success = json2["success"] as? Int
                println("Success: \(success)")
            }
        })
    
        task.resume()
    }
    

    在这里,我为参数制作了一个单独的字典 .

    var params = ["format":"json", "MobileType":"IOS","MIN":"f8d16d98ad12acdbbe1de647414495ec","UserName":emailTxtField.text,"PWD":passwordTxtField.text,"SigninVia":"SH"]as NSDictionary
        return params
    }
    
    // You can add your own sets of parameter here.
    
  • 93

    这是操场上一个非常简单的 Swift 4 示例:

    import UIKit
    // run asynchronously in a playground
    import PlaygroundSupport
    PlaygroundPage.current.needsIndefiniteExecution = true
    
    // create a url
    let url = URL(string: "http://www.stackoverflow.com")
    
    // create a data task
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error != nil {
            print("there's a problem")
        }
        print(String(data: data!, encoding: String.Encoding.utf8) ?? "")
    }
    
    //running the task w/ resume
    task.resume()
    
  • 2

    另一个选项是提供可链接请求/响应方法的 Alamofire lib .

    https://github.com/Alamofire/Alamofire

    Making a Request

    import Alamofire
    
    Alamofire.request(.GET, "http://httpbin.org/get")
    

    Response Handling

    Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
             .response { request, response, data, error in
                  print(request)
                  print(response)
                  print(error)
              }
    
  • 7

    检查以下代码:

    1. SynchonousRequest

    Swift 1.2

    let urlPath: String = "YOUR_URL_HERE"
        var url: NSURL = NSURL(string: urlPath)!
        var request1: NSURLRequest = NSURLRequest(URL: url)
        var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil
        var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
        var err: NSError
        println(response)
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary
        println("Synchronous\(jsonResult)")
    

    Swift 2.0 +

    let urlPath: String = "YOUR_URL_HERE"
        let url: NSURL = NSURL(string: urlPath)!
        let request1: NSURLRequest = NSURLRequest(URL: url)
        let response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil
    
    
        do{
    
            let dataVal = try NSURLConnection.sendSynchronousRequest(request1, returningResponse: response)
    
                print(response)
                do {
                    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(dataVal, options: []) as? NSDictionary {
                        print("Synchronous\(jsonResult)")
                    }
                } catch let error as NSError {
                    print(error.localizedDescription)
                }
    
    
    
        }catch let error as NSError
        {
             print(error.localizedDescription)
        }
    

    2. AsynchonousRequest

    Swift 1.2

    let urlPath: String = "YOUR_URL_HERE"
        var url: NSURL = NSURL(string: urlPath)!
        var request1: NSURLRequest = NSURLRequest(URL: url)
        let queue:NSOperationQueue = NSOperationQueue()
        NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            var err: NSError
            var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
            println("Asynchronous\(jsonResult)")
           })
    

    Swift 2.0 +

    let urlPath: String = "YOUR_URL_HERE"
        let url: NSURL = NSURL(string: urlPath)!
        let request1: NSURLRequest = NSURLRequest(URL: url)
        let queue:NSOperationQueue = NSOperationQueue()
    
        NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
    
            do {
                if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary {
                    print("ASynchronous\(jsonResult)")
                }
            } catch let error as NSError {
                print(error.localizedDescription)
            }
    
    
        })
    

    3. As usual URL connection

    Swift 1.2

    var dataVal = NSMutableData()
        let urlPath: String = "YOUR URL HERE"
        var url: NSURL = NSURL(string: urlPath)!
        var request: NSURLRequest = NSURLRequest(URL: url)
        var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)!
        connection.start()
    

    然后

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
        self.dataVal?.appendData(data)
    }
    
    
    func connectionDidFinishLoading(connection: NSURLConnection!)
    {
        var error: NSErrorPointer=nil
    
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal!, options: NSJSONReadingOptions.MutableContainers, error: error) as NSDictionary
    
        println(jsonResult)
    
    
    
    }
    

    Swift 2.0 +

    var dataVal = NSMutableData()
        let urlPath: String = "YOUR URL HERE"
        var url: NSURL = NSURL(string: urlPath)!
        var request: NSURLRequest = NSURLRequest(URL: url)
        var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)!
        connection.start()
    

    然后

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
        dataVal.appendData(data)
    }
    
    
    func connectionDidFinishLoading(connection: NSURLConnection!)
    {
    
        do {
            if let jsonResult = try NSJSONSerialization.JSONObjectWithData(dataVal, options: []) as? NSDictionary {
                print(jsonResult)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    
    }
    

    4. Asynchonous POST Request

    Swift 1.2

    let urlPath: String = "YOUR URL HERE"
        var url: NSURL = NSURL(string: urlPath)!
        var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    
        request1.HTTPMethod = "POST"
         var stringPost="deviceToken=123456" // Key and Value
    
        let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)
    
        request1.timeoutInterval = 60
        request1.HTTPBody=data
        request1.HTTPShouldHandleCookies=false
    
        let queue:NSOperationQueue = NSOperationQueue()
    
         NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
    
    
            var err: NSError
    
            var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
            println("AsSynchronous\(jsonResult)")
    
    
            })
    

    Swift 2.0 +

    let urlPath: String = "YOUR URL HERE"
        let url: NSURL = NSURL(string: urlPath)!
        let request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    
        request1.HTTPMethod = "POST"
        let stringPost="deviceToken=123456" // Key and Value
    
        let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)
    
        request1.timeoutInterval = 60
        request1.HTTPBody=data
        request1.HTTPShouldHandleCookies=false
    
        let queue:NSOperationQueue = NSOperationQueue()
    
        NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
    
            do {
                if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary {
                    print("ASynchronous\(jsonResult)")
                }
            } catch let error as NSError {
                print(error.localizedDescription)
            }
    
    
        })
    

    5. Asynchonous GET Request

    Swift 1.2

    let urlPath: String = "YOUR URL HERE"
        var url: NSURL = NSURL(string: urlPath)!
        var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    
        request1.HTTPMethod = "GET"
        request1.timeoutInterval = 60
        let queue:NSOperationQueue = NSOperationQueue()
    
         NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
    
    
            var err: NSError
    
            var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
            println("AsSynchronous\(jsonResult)")
    
    
            })
    

    Swift 2.0 +

    let urlPath: String = "YOUR URL HERE"
        let url: NSURL = NSURL(string: urlPath)!
        let request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    
        request1.HTTPMethod = "GET"
        let queue:NSOperationQueue = NSOperationQueue()
    
        NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
    
            do {
                if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary {
                    print("ASynchronous\(jsonResult)")
                }
            } catch let error as NSError {
                print(error.localizedDescription)
            }
    
    
        })
    

    6. Image(File) Upload

    Swift 2.0 +

    let mainURL = "YOUR_URL_HERE"
    
        let url = NSURL(string: mainURL)
        let request = NSMutableURLRequest(URL: url!)
        let boundary = "78876565564454554547676"
        request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
    
        request.HTTPMethod = "POST" // POST OR PUT What you want
        let session = NSURLSession(configuration:NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: nil)
    
        let imageData = UIImageJPEGRepresentation(UIImage(named: "Test.jpeg")!, 1)
    
    
    
    
    
        var body = NSMutableData()
    
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
        // Append your parameters
    
        body.appendData("Content-Disposition: form-data; name=\"name\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("PREMKUMAR\r\n".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
        body.appendData("Content-Disposition: form-data; name=\"description\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("IOS_DEVELOPER\r\n".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
    
        // Append your Image/File Data
    
        var imageNameval = "HELLO.jpg"
    
        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition: form-data; name=\"profile_photo\"; filename=\"\(imageNameval)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(imageData!)
        body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
        body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
        request.HTTPBody = body
    
    
    
    
        let dataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
    
            if error != nil {
    
                //handle error
    
    
            }
            else {
    
    
    
    
                let outputString : NSString = NSString(data:data!, encoding:NSUTF8StringEncoding)!
                print("Response:\(outputString)")
    
    
            }
        }
        dataTask.resume()
    
  • 7

    详情

    Xcode 9.2,Swift 4

    解决方案

    import Foundation
    
    class Data {
    
        static fileprivate let queue = DispatchQueue(label: "requests.queue", qos: .utility)
        static fileprivate let mainQueue = DispatchQueue.main
    
        fileprivate class func make(session: URLSession = URLSession.shared, request: URLRequest, closure: @escaping (_ json: [String: Any]?, _ error: Error?)->()) {
                let task = session.dataTask(with: request) { data, response, error in
                    queue.async {
                        guard error == nil else {
                            return
                        }
                        guard let data = data else {
                            return
                        }
    
                        do {
                            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                                mainQueue.async {
                                    closure(json, nil)
                                }
                            }
                        } catch let error {
                            print(error.localizedDescription)
                            mainQueue.async {
                                closure(nil, error)
                            }
                        }
                    }
                }
    
                task.resume()
        }
    
        class func searchRequest(term: String, closure: @escaping (_ json: [String: Any]?, _ error: Error?)->()) {
            let url = URL(string: "https://itunes.apple.com/search?term=\(term.replacingOccurrences(of: " ", with: "+"))")
            let request = URLRequest(url: url!)
            Data.make(request: request) { json, error in
                closure(json, error)
            }
        }
    }
    

    用法

    Data.searchRequest(term: "jack johnson") { json, error  in
          print(error ?? "nil")
          print(json ?? "nil")
          print("Update views")
    }
    

    结果

    enter image description here

  • -1

    //这是一个适合我的例子

    //使用键值向服务器发送请求的Swift函数

    func insertRecords()
    {
    
    
    
        let usrID = txtID.text
        let checkin = lblInOut.text
        let comment = txtComment.text
    
    
    
        // The address of the web service
        let urlString = "http://your_url/checkInOut_post.php"
    
        // These are the keys that your are sending as part of the post request
        let keyValues = "id=\(usrID)&inout=\(checkin)&comment=\(comment)"
    
    
    
    
        // 1 - Create the session by getting the configuration and then
        //     creating the session
    
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: nil)
    
    
        // 2 - Create the URL Object
    
        if let url = NSURL(string: urlString){
    
    
            // 3 - Create the Request Object
    
            var request  = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "POST"
    
            // set the key values
            request.HTTPBody = keyValues.dataUsingEncoding(NSUTF8StringEncoding);
    
    
            // 4 - execute the request
    
            let taskData = session.dataTaskWithRequest(request, completionHandler: {
    
                (data:NSData!, response:NSURLResponse!, error:NSError!) -> Void in
    
                println("\(data)")
    
                // 5 - Do something with the Data back
    
                if (data != nil) {
    
                    // we got some data back
                    println("\(data)")
    
                    let result = NSString(data: data , encoding: NSUTF8StringEncoding)
                    println("\(result)")
    
                    if result == "OK" {
    
                        let a = UIAlertView(title: "OK", message: "Attendece has been recorded", delegate: nil, cancelButtonTitle: "OK")
    
                        println("\(result)")
    
                        dispatch_async(dispatch_get_main_queue()) {
    
    
                        a.show()
    
    
                        }
    
    
                    } else {
                      // display error and do something else
    
                    }
    
    
                } else
    
                {   // we got an error
                    println("Error getting stores :\(error.localizedDescription)")
    
                }
    
    
            })
    
            taskData.resume()
    
    
    
        }
    
    
    }
    

    PHP代码获取键值

    $ empID = $ _POST ['id'];

    $ inOut = $ _POST ['inout'];

    $ comment = $ _POST ['comment'];

  • 18

    Basic Swift 3 Solution

    let url = URL(string: "http://www.stackoverflow.com")
    
    let task = URLSession.shared.dataTask(with: url! as URL) { data, response, error in
    
      guard let data = data, error == nil else { return }
    
      print(NSString(data: data, encoding: String.Encoding.utf8.rawValue))
    }
    
    task.resume()
    
  • 91

    下面给出了样本“GET”请求的示例 .

    let urlString = "YOUR_GET_URL"
    let yourURL = URL(string: urlstring)
    let dataTask = URLSession.shared.dataTask(with: yourURL) { (data, response, error) in
    do {
        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
        print("json --- \(json)")
        }catch let err {
        print("err---\(err.localizedDescription)")
        }
       }
    dataTask.resume()
    
  • 0

    您可以使用Just,一个 python-requests 样式的HTTP库 .

    使用Just发送HTTP请求的一些示例:

    // synchronous GET request with URL query a=1
    let r = Just.get("https://httpbin.org/get", params:["a":1])
    
    // asynchronous POST request with form value and file uploads
    Just.post(
        "http://justiceleauge.org/member/register",
        data: ["username": "barryallen", "password":"ReverseF1ashSucks"],
        files: ["profile_photo": .URL(fileURLWithPath:"flash.jpeg", nil)]
    ) { (r)
        if (r.ok) { /* success! */ }
    }
    

    在这两种情况下,可以通过类似于 python-request 的方式访问请求 r 的结果:

    r.ok            // is the response successful?
    r.statusCode    // status code of response
    r.content       // response body as NSData?
    r.text          // response body as text?
    r.json          // response body parsed by NSJSONSerielization
    

    你可以在这里找到更多的例子playground

    在游乐场中以同步模式使用此库是最接近Swift的cURL .

  • 15

    一个简单的Swift 2.0方法来发出HTTP GET请求

    HTTP请求是异步的,因此您需要一种从HTTP请求获取返回值的方法 . 此方法使用通知程序,并分布在两个类中 .

    示例是使用网站http://www.example.com/handler.php?do=CheckUserJson&json=检查标识符令牌的用户名和密码 . 该文件名为handler.php,并且在do参数上有一个switch语句以获取RESTful方法 .

    在viewDidLoad中,我们设置NotifierObserver,设置json并调用getHTTPRequest函数 . 它将使用http请求中返回的参数返回函数checkedUsernameAndPassword .

    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.
        }
    }
    

    Utility.swift中有两个静态函数,首先对json进行编码,然后进行HTTP调用 .

    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
        }
    }
    

    和Http请求

    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)")
        }
    }
    

    sendNotification函数完成圆圈 . 请注意,在Obh Observer中,选择器字符串的末尾有一个“:” . 这允许通知在userInfo中携带有效负载 . 我给它一个String和一个Int .

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

    请注意,使用HTTP是oldFashioned,更喜欢HTTPS,请参阅How do I load an HTTP URL with App Transport Security enabled in iOS 9?

  • 0

    在Swift 4.2和Xcode10中 .

    JSON POST 方法示例

    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()
    
        }
    
    }
    

    如果您有兴趣在 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() {
    
    }
    

    最后像这样调用这个函数....

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

    您可以像在Objective-C中一样使用 URLURLRequestURLSessionNSURLConnection . 请注意,对于iOS 7.0及更高版本,首选 URLSession .

    使用URLSession

    URLSession 初始化 URL 对象和 URLSessionDataTask . 然后使用 resume() 运行任务 .

    let url = URL(string: "http://www.stackoverflow.com")!
    
    let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
        guard let data = data else { return }
        print(String(data: data, encoding: .utf8)!)
    }
    
    task.resume()
    

    使用NSURLConnection

    首先,初始化 URLURLRequest

    let url = URL(string: "http://www.stackoverflow.com")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    

    然后,您可以异步加载请求:

    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main) {(response, data, error) in
        guard let data = data else { return }
        print(String(data: data, encoding: .utf8)!)
    }
    

    或者您可以初始化 NSURLConnection

    let connection = NSURLConnection(request: request, delegate:nil, startImmediately: true)
    

    只需确保将委托设置为 nil 以外的其他内容,并使用委托方法处理收到的响应和数据 .

    有关更多详细信息,请查看documentation for the NSURLConnectionDataDelegate protocol

    在Xcode游乐场上进行测试

    如果您想在Xcode游乐场上尝试此代码,请将 import PlaygroundSupport 添加到您的游乐场,以及以下调用:

    PlaygroundPage.current.needsIndefiniteExecution = true
    

    这将允许您在游乐场中使用异步代码 .

  • 0

    我用 JSON Parsing 这样做 HTTP 请求 Both 方法 GETPOST

    viewDidLoad()

    override func viewDidLoad() {
    super.viewDidLoad()
    
        makeGetRequest()
        makePostRequest()
    
    }
    
    func makePostRequest(){
    
        let urlPath: String = "http://www.swiftdeveloperblog.com/http-post-example-script/"
        var url: NSURL = NSURL(string: urlPath)!
        var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    
        request.HTTPMethod = "POST"
        var stringPost="firstName=James&lastName=Bond" // Key and Value
    
        let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)
    
        request.timeoutInterval = 60
        request.HTTPBody=data
        request.HTTPShouldHandleCookies=false
    
        let queue:NSOperationQueue = NSOperationQueue()
    
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
            let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary
    
             if (jsonResult != nil) {
                // Success
               println(jsonResult)
    
               let message = jsonResult["Message"] as! NSString
    
               println(message)
             }else {
                // Failed
                println("Failed")
            }
    
        })
    
    }
    
    func makeGetRequest(){
        var url : String = "http://api.androidhive.info/contacts/"
        var request : NSMutableURLRequest = NSMutableURLRequest()
        request.URL = NSURL(string: url)
        request.HTTPMethod = "GET"
        request.timeoutInterval = 60
    
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
            let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary
    
            if (jsonResult != nil) {
                // Success
                println(jsonResult)
    
                let dataArray = jsonResult["contacts"] as! NSArray;
    
                for item in dataArray { // loop through data items
    
                    let obj = item as! NSDictionary
    
                    for (key, value) in obj {
    
                        println("Key: \(key) - Value: \(value)")
    
                        let phone = obj["phone"] as! NSDictionary;
    
                        let mobile = phone["mobile"] as! NSString
                        println(mobile)
                        let home = phone["home"] as! NSString
                        println(home)
                        let office = phone["office"] as! NSString
                        println(office)
                    }
                }
    
            } else {
                // Failed
                println("Failed")
            }
    
        })
    }
    

    Done

相关问题