He leído El Lenguaje de Programación Swift por parte de Apple en iBooks, pero no puede averiguar cómo hacer una petición http (algo así como CURL) en Swift. Qué necesito para la importación de Obj-C clases o sólo debo la necesidad de importación de bibliotecas predeterminadas? O no es posible hacer una petición HTTP basado en nativo código swift?

InformationsquelleAutor Dicky Tsang | 2014-06-03

17 Comentarios

  1. 89

    Otra opción es la Alamofire lib que ofrece Encadenable de Solicitud /Respuesta de los métodos.

    https://github.com/Alamofire/Alamofire

    Hacer una Petición

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

    De Respuesta Manejo De

    Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
             .response { request, response, data, error in
                  print(request)
                  print(response)
                  print(error)
              }
    • Creo que responder por lo que sugiere un externo lib, mientras que la funcionalidad es proporcionada por el framework no es la manera correcta de hacerlo.
    • es derecho. Cezar la respuesta es más completa y no usar librerías externas. Que debe ser aceptado respuesta.
    • Cezar la respuesta es obsoleto (ya Swift 3) y la interfaz de Alamofire es mucho más agradable que la de URLSession y consortes. También, la aceptación no es una medida de algunos abstractos medida de la bondad (por no hablar de la tuya! 😉 ) pero de lo que ayudó a que el OP de la mayoría. (Por «pura» de las soluciones, hay Documentación!) Si que se esta respuesta, perfecto … no es el uso de los primeros principios, pero luego que no siempre es la solución «correcta», ¿no?
    • Swift 3 Alamofire.request(url, method: .get)
    • Por favor, no ofrecen las bibliotecas de terceros a menos que sea específicamente solicitado por ASÍ directrices
    • Alamofire es mejor
    • Podemos comentar la respuesta a la actualización si es anticuado. Como pasa el tiempo, esta respuesta va a llegar desfasada cuando Alamofile versión nueva (incompatible) versión. Como para como más agradable la interfaz es, yo diría que depende; algunos dice «sintaxis de jQuery es mucho mejor que los nativos de JavaScript» así.
    • por favor que me señale hacia una escritura de esas directrices?
    • se supone que para ser efímero; idealmente, las respuestas continuamente modificarse para reflejar un corriente solución, o al menos hacer previamente supuestos implícitos explícitos.
    • Creo que no aclaran: me sugirió comentario notificar a los autores de la actualización, por lo que los autores de la actualización de las respuestas para hacer de él un solución actual. Esto es exactamente lo que le sucedió a la respuesta que usted ha mencionado: autor realizó la actualización de la respuesta después de tu comentario.

  2. 490

    Puede utilizar URL, URLRequest y URLSession o NSURLConnection como normalmente se hacen en Objective-C. tenga en cuenta que para iOS 7.0 y versiones posteriores, URLSession es el preferido.

    Utilizando URLSession

    Inicializar un URL objeto y un URLSessionDataTask de URLSession. A continuación, ejecute la tarea con 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()

    Utilizando NSURLConnection

    Primero, inicializar un URL y un URLRequest:

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

    A continuación, puede cargar la solicitud de forma asíncrona con:

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

    O puede inicializar un NSURLConnection:

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

    Sólo asegúrese de configurar su delegado a algo distinto de nil y el uso de los métodos de delegado para el trabajo con la respuesta y los datos recibidos.

    Para obtener más detalles, consulte la documentación para el NSURLConnectionDataDelegate protocolo

    Pruebas en un Xcode patio

    Si quieres probar este código en Xcode zona de juegos infantil, agregar import PlaygroundSupport a su patio de recreo, así como la siguiente llamada:

    PlaygroundPage.current.needsIndefiniteExecution = true

    Esto le permitirá utilizar el código asincrónico en el patio.

    • No pierdas tu tiempo en iOS 8 beta 2 en un patio de recreo como XCPlayground no es compatible. No es una inteligente y fea manera a esperar si quieres probar un hack: stackoverflow.com/a/24058337/700206
    • XCPlayground apoyado en Xcode 6 Beta 3 ahora
    • ¿Cómo enviar datos de envío utilizando NSURLSession?
    • Gracias por la info acerca de su uso en un patio de recreo!
    • En este ejemplo se produce un error en 6.1: de prueba.swift:5:57: error: valor de tipo opcional ‘NSURL?’ no envueltos; quiso decir el uso de ‘!’ o ‘?’? vamos a task = NSURLSession.sharedSession().dataTaskWithURL(url) {(datos, respuesta, error) en
    • Tienen el mismo error como mcuadros. Ninguna solución hasta ahora ;(
    • La adición de un signo de exclamación correcciones @mcuadros’ mensaje de error … .dataTaskWithURL(url!)
    • Nadie puede llegar a trabajar con https?
    • se produce un error en «datos» en la impresión (el primer ejemplo) . valor opcional NSData no sin envolver
    • Desde Swift 3, puedes colocar todos los NS prefijos.
    • Puede usted por favor arreglar los fragmentos de código? Aquí es lo que funciona como de Swift 4 print(String(data: data!, encoding: String.Encoding.utf8))
    • NOTA: re: parques infantiles, si usted está viendo una desatención aviso para XCPlayground, utilice este código: import PlaygroundSupport; PlaygroundPage.actual.needsIndefiniteExecution = true

  3. 97

    Compruebe Los Siguientes Códigos :

    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. Como de costumbre URL de conexión

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

    Luego

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

    Luego

    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 Solicitud POST

    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 Solicitud GET

    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. Imagen(Archivo) Cargar

    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()
  4. 33

    Swift 3 y Swift 4: Solicitud de Datos utilizando 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, Descifrable y Resultado de la enumeración

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

    ejemplo:

    //si queremos recuperar todo de marcador de posición de la API, a continuación, definimos las Tareas struct y llame a dataRequest y pasar «https://jsonplaceholder.typicode.com/todos/1» cadena de dirección 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)
    }
    }

    //esto imprime el resultado:

    ToDo(id: 1, userId: 1, title: "delectus aut autem", completed: false)
    • Increíblemente útil, gracias Suhit.
  5. 20

    Básica Swift 3 Solución

    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()
    • Su ejemplo es para Swift 3, por lo que debe utilizar URL(string: "http://www.stackoverflow.com") en lugar de NSURL
    • Saludos! Actualizado
    • la conversión de URL a URL no tiene sentido URLSession.shared.dataTask(with: url!)
    • Me sale este error: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
    • Has configurado la aplicación de seguridad en el transporte como por este post stackoverflow.com/questions/30731785/…
    • Leo Dabus la variable url es del tipo de URL?

  6. 14

    Estoy utilizando este tipo de contenedor con buenos resultados hasta el momento
    https://github.com/daltoniam/swiftHTTP. No es gran fugas de abstracciones hasta ahora

    Ejemplo

        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)")
    }
    • Has encontrado una manera de esperar la petición para terminar antes de mostrar la vista? @AlexanderN
  7. 9

    Detalles

    • Xcode 9.2, Swift 4
    • Xcode 10.2.1 (10E1001), Swift 5

    Info.plist

    NSAppTransportSecurity

    Añadir a la información plist:

    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    </dict>

    Alamofire Muestra

    Alamofire

    import Alamofire
    class AlamofireDataManager {
    fileprivate let queue: DispatchQueue
    init(queue: DispatchQueue) { self.queue = queue }
    private func createError(message: String, code: Int) -> Error {
    return NSError(domain: "dataManager", code: code, userInfo: ["message": message ])
    }
    private func make(session: URLSession = URLSession.shared, request: URLRequest, closure: ((Result<[String: Any]>) -> Void)?) {
    Alamofire.request(request).responseJSON { response in
    let complete: (Result<[String: Any]>) ->() = { result in DispatchQueue.main.async { closure?(result) } }
    switch response.result {
    case .success(let value): complete(.success(value as! [String: Any]))
    case .failure(let error): complete(.failure(error))
    }
    }
    }
    func searchRequest(term: String, closure: ((Result<[String: Any]>) -> Void)?) {
    guard let url = URL(string: "https://itunes.apple.com/search?term=\(term.replacingOccurrences(of: " ", with: "+"))") else { return }
    let request = URLRequest(url: url)
    make(request: request) { response in closure?(response) }
    }
    }

    Uso de Alamofire muestra

    private lazy var alamofireDataManager = AlamofireDataManager(queue: DispatchQueue(label: "DataManager.queue", qos: .utility))
    //.........
    alamofireDataManager.searchRequest(term: "jack johnson") { result in
    print(result.value ?? "no data")
    print(result.error ?? "no error")
    }

    URLSession Muestra

    import Foundation
    class DataManager {
    fileprivate let queue: DispatchQueue
    init(queue: DispatchQueue) { self.queue = queue }
    private func createError(message: String, code: Int) -> Error {
    return NSError(domain: "dataManager", code: code, userInfo: ["message": message ])
    }
    private func make(session: URLSession = URLSession.shared, request: URLRequest, closure: ((_ json: [String: Any]?, _ error: Error?)->Void)?) {
    let task = session.dataTask(with: request) { [weak self] data, response, error in
    self?.queue.async {
    let complete: (_ json: [String: Any]?, _ error: Error?) ->() = { json, error in DispatchQueue.main.async { closure?(json, error) } }
    guard let self = self, error == nil else { complete(nil, error); return }
    guard let data = data else { complete(nil, self.createError(message: "No data", code: 999)); return }
    do {
    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
    complete(json, nil)
    }
    } catch let error { complete(nil, error); return }
    }
    }
    task.resume()
    }
    func searchRequest(term: String, closure: ((_ json: [String: Any]?, _ error: Error?)->Void)?) {
    let url = URL(string: "https://itunes.apple.com/search?term=\(term.replacingOccurrences(of: " ", with: "+"))")
    let request = URLRequest(url: url!)
    make(request: request) { json, error in closure?(json, error) }
    }
    }

    Uso de URLSession muestra

    private lazy var dataManager = DataManager(queue: DispatchQueue(label: "DataManager.queue", qos: .utility))
    //.......
    dataManager.searchRequest(term: "jack johnson") { json, error  in
    print(error ?? "nil")
    print(json ?? "nil")
    print("Update views")
    }

    Resultados

    Cómo hacer una petición HTTP en Swift?

    • searchRequest? plazo? ¿De dónde vienen?
    • Este es el total de la muestra de la solicitud. class func searchRequest(term: String, ... es la muestra de la descarga de datos desde itunes.apple.com. Este ejemplo de la búsqueda, así que, opté/inventado searchRequest nombre de la función. term es parte «itunes.apple.com/search?» petición. Usted puede elegir cualquiera de los nombres de las funciones que describe su modelo de lógica.
    • Solución agradable. He cambiado el closure para devolver un enum con los casos success y error.
  8. 7

    He hecho HTTP Solicitud Tanto métodos OBTENER & POST con JSON Análisis de esta manera:

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

    Hecho

    • No se puede invocar ‘sendAsynchronousRequest’ con una lista de argumentos de tipo ‘(NSMutableURLRequest, la cola: NSOperationQueue, completionHandler: (NSURLResponse!, NSData!, NSError!) -> Void)’
    • Estoy usando xcode 6.3
  9. 3

    Estoy llamando al json en el botón de inicio de sesión haga clic en

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

    Aquí, he hecho una nueva diccionario de los parámetros.

    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.
  10. 2

    Puede utilizar Sólo, un python-requests estilo HTTP biblioteca.

    Algunos ejemplo de envío de la solicitud HTTP con Sólo:

    //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! */ }
    }

    En ambos casos, el resultado de una petición r se puede acceder de manera similar a python-request:

    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

    Usted puede encontrar más ejemplos en este zona de juegos infantil

    Uso de esta biblioteca en modo sincrónico en un patio de recreo es la cosa más cercana a la curvatura se puede obtener en Swift.

    • Mientras que este vínculo puede responder a la pregunta, es mejor incluir a las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Enlace-sólo respuestas puede ser válido si la página enlazada cambios.
    • Parece que esta biblioteca está en desuso. Sin Swift 4 de soporte y nadie responde a los problemas abiertos.
  11. 2

    En Swift 4.1 y Xcode 9.4.1.

    JSON POST enfoque de ejemplo. Para comprobar la conexión a internet de agregar la Accesibilidad.h & .m archivos de 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()
    }
    }

    Si usted tiene interés en utilizar esta función en 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() {
    }

    Y finalmente llamar a esta función como esta….

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

    Un simple Swift 2.0 enfoque para hacer una solicitud HTTP GET

    La petición HTTP es asíncrona por lo que necesita una manera de obtener el valor devuelto de la Petición HTTP. Este enfoque utiliza los Notificadores y se distribuye en dos clases.

    El ejemplo es para comprobar el nombre de usuario y la contraseña de un símbolo identificador de utilizar el sitio web http://www.example.com/handler.php?do=CheckUserJson&json= Que es el archivo que se llama handler.php y tiene una instrucción switch en los parámetros para obtener un RESTful.

    En el viewDidLoad configuramos el NotifierObserver, configurar el json y hacer la llamada a la getHTTPRequest función. Se regresará a la función checkedUsernameAndPassword devuelve el parámetro de la petición http.

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

    Hay dos funciones estáticas en la Utilidad.swift primera para codificar el json y luego hacer la llamada 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
    }
    }

    y la solicitud 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)")
    }
    }

    La sendNotification función se completa el círculo. Observe que en el Observador no es un «:» al final del selector de cadena. Esto permite que la notificación para transportar una carga útil en userInfo. Le doy a este una Cadena y un entero.

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

    Nota de que el uso de HTTP es anticuado, prefieren HTTPS ver ¿Cómo puedo cargar una dirección URL HTTP con la Aplicación de Transporte habilitada la Seguridad en iOS 9?

  13. 0
     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")
    }

    le ayudará seguramente

  14. 0

    //Aquí está un ejemplo que trabajó para mí

    //Swift función de que después de una solicitud a un servidor con los valores de la clave

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

    Código PHP para obtener los valores de clave

    $empID = $_POST[‘id’];

    $entrada = $_POST[‘entrada’];

    $comentario = $_POST[‘comentario’];

  15. 0

    Aquí una manera muy simple Swift 4 ejemplo en un patio de recreo:

    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()
  16. 0

    Utilizando URLSession + Swift 5

    Acaba de añadir a cezar la respuesta, si usted quiere hacer la solicitud en la web utilizando de Apple URLSession clase, hay varias manera de hacer la tarea

    1. Simple Petición GET con URL
    2. Simple Petición GET con la URL y los Parámetros de
    3. Simple Petición GET con la dirección URL con el Error de Manipulación
    4. Simple Petición POST con la URL, Parámetros con el Error de Manipulación

    1. Simple Petición GET con URL

    func simpleGetUrlRequest()
    {
    let url = URL(string: "https://httpbin.org/get")!
    let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
    guard let data = data else { return }
    print("The response is : ",String(data: data, encoding: .utf8)!)
    //print(NSString(data: data, encoding: String.Encoding.utf8.rawValue) as Any)
    }
    task.resume()
    }

    Nota : asegúrese de que Usted debe agregar «NSAppTransportSecurity» llave en pList para http solicitudes

    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    </dict>

    2. Simple Petición GET con la URL y los Parámetros de

    func simpleGetUrlWithParamRequest()
    {
    let url = URL(string: "https://www.google.com/search?q=peace")!
    let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
    if error != nil || data == nil {
    print("Client error!")
    return
    }
    guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
    print("Server error!")
    return
    }
    print("The Response is : ",response)
    }
    task.resume()
    }

    3. Simple Petición GET con la dirección URL con el Error de Manipulación

    func simpleGetUrlRequestWithErrorHandling()
    {
    let session = URLSession.shared
    let url = URL(string: "https://httpbin.org/get")!
    let task = session.dataTask(with: url) { data, response, error in
    if error != nil || data == nil {
    print("Client error!")
    return
    }
    guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
    print("Server error!")
    return
    }
    guard let mime = response.mimeType, mime == "application/json" else {
    print("Wrong MIME type!")
    return
    }
    do {
    let json = try JSONSerialization.jsonObject(with: data!, options: [])
    print("The Response is : ",json)
    } catch {
    print("JSON error: \(error.localizedDescription)")
    }
    }
    task.resume()
    }

    4. Simple Petición POST con la URL, Parámetros con el Error de Manipulación.

    func simplePostRequestWithParamsAndErrorHandling(){
    var session = URLSession.shared
    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = 30
    configuration.timeoutIntervalForResource = 30
    session = URLSession(configuration: configuration)
    let url = URL(string: "https://httpbin.org/post")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    let parameters = ["username": "foo", "password": "123456"]
    do {
    request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
    } catch let error {
    print(error.localizedDescription)
    }
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    if error != nil || data == nil {
    print("Client error!")
    return
    }
    guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
    print("Oops!! there is server error!")
    return
    }
    guard let mime = response.mimeType, mime == "application/json" else {
    print("response is not json")
    return
    }
    do {
    let json = try JSONSerialization.jsonObject(with: data!, options: [])
    print("The Response is : ",json)
    } catch {
    print("JSON error: \(error.localizedDescription)")
    }
    })
    task.resume()
    }

    Sus sugerencias se agradece!!

    • ¿Por qué utilizar var session = URLSession.shared cuando no la estás utilizando, pero sólo sobrescribir la variable? Es necesario?
  17. -1

    Un ejemplo para una muestra de «OBTENER» solicitud es la siguiente.

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

Dejar respuesta

Please enter your comment!
Please enter your name here