web-dev-qa-db-fra.com

Demandes HTTP dans Swift 3

Je suis assez nouveau sur Swift et j'essaie de faire une requête HTTP. J'ai essayé beaucoup d'idées dans cette question de débordement de pile , mais toutes ont causé des erreurs lors de l'exécution dans une aire de jeux; Je pense que c'est parce qu'ils sont tous en Swift 1.0-2.0.

Comment puis-je faire une requête HTTP dans Swift 3?

Mise à jour J'ai essayé la première solution présentée dans cette réponse et, après avoir terminé le "Fix-its" suggéré par Xcode, j'ai rencontré quatre erreurs :

enter image description here

11
owlswipe

Il y a quelques problèmes avec votre code:

  1. Par défaut, votre application ne peut pas se connecter à un site non sécurisé (c'est-à-dire HTTP). C'est une fonctionnalité appelée App Transport Security. Vous devez faire une exception dans le fichier Info.plist De votre application pour vous connecter aux sites HTTP.
  2. Ceci: dataTask(urlwith: ! as URL). Qu'essayez-vous de déballer avec le point d'exclamation (!)? Quel est le nom de la variable?

Beaucoup de noms de classe ont changé entre Swift 2 et 3, donc les réponses que vous avez trouvées peuvent ne pas être applicables. Ci-dessous, un exemple qui se connecte à httpbin.org pour obtenir votre adresse IP:

import PlaygroundSupport
import Foundation

let url = URL(string: "https://httpbin.org/ip")

let task = URLSession.shared.dataTask(with: url!) { data, response, error in
    guard error == nil else {
        print(error!)
        return
    }
    guard let data = data else {
        print("Data is empty")
        return
    }

    let json = try! JSONSerialization.jsonObject(with: data, options: [])
    print(json)
}

task.resume()
PlaygroundPage.current.needsIndefiniteExecution = true
40
Code Different

Il y a des erreurs de frappe (pas de variable URL dans l'appel) dans votre code.

Quoi qu'il en soit, dans Swift 3, il est préférable d'utiliser la nouvelle structure d'URL et la classe URLSession.

De plus, XCPlayground est maintenant PlaygroundSupport.

Et pas besoin d'utiliser NSString lorsque String est disponible.

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

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

Remarque: ceci concerne Xcode 8 beta 2. Sur la beta 1, vous devrez faire shared() au lieu de shared. Si vous êtes sur iOS, n'oubliez pas de import UIKit, Mais ce code fonctionne également pour OS X si vous import Cocoa À la place.

14
ayaio

Dans votre erreur, il semble que l'URL soit manquante. Voici un simple appel API pour vous aider à démarrer.

import UIKit
import Foundation
import PlaygroundSupport

let url:URL = URL(string: "http://jsonplaceholder.typicode.com/posts")!
let session = URLSession.shared

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

let paramString = "data=Hello"
request.httpBody = paramString.data(using: String.Encoding.utf8)

let task = session.dataTask(with: request as URLRequest) {
    (
    data, response, error) in

    guard let data = data, let _:URLResponse = response  where error == nil else {
        print("error")
        return
    }

    let dataString =  String(data: data, encoding: String.Encoding.utf8)
    print(dataString)

}

task.resume()

PlaygroundPage.current.needsIndefiniteExecution = true
9
Ali Kıran