457 Stimmen

Wie man in Swift eine HTTP-Anfrage stellt?

Ich habe "Die Programmiersprache Swift" von Apple in iBooks gelesen, kann aber nicht herausfinden, wie man in Swift eine HTTP-Anfrage (etwas ähnliches wie cURL) erstellt. Muss ich Obj-C-Klassen importieren oder reicht es aus, Standardbibliotheken zu importieren? Oder ist es nicht möglich, basierend auf nativem Swift-Code eine HTTP-Anfrage zu erstellen?

14voto

Alex Nolasco Punkte 17867

Swift 3.0

Durch eine kleine Abstraktion https://github.com/daltoniam/swiftHTTP

Beispiel

    do {
        let opt = try HTTP.GET("https://google.com")
        opt.start { response in
            if let err = response.error {
                print("Fehler: \(err.localizedDescription)")
                return //Benachrichtigen Sie die App bei Bedarf auch über das Versagen
            }
            print("Opt abgeschlossen: \(response.description)")
            //print("Daten sind: \(response.data)") Zugriff auf die Antwort der Daten mit response.data
        }
    } catch let error {
        print("Es ist ein Fehler bei der Erstellung der Anfrage aufgetreten: \(error)")
    }

7voto

Hiren Patel Punkte 50526

Ich habe HTTP Request beide Methoden GET & POST mit JSON-Parsing auf diese Weise gemacht:

im 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" // Schlüssel und Wert

    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 = nil
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary

         if (jsonResult != nil) {
            // Erfolg
           println(jsonResult)

           let message = jsonResult["Message"] as! NSString

           println(message)
         }else {
            // Fehler
            println("Fehler")
        }

    })

}

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 = nil
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary

        if (jsonResult != nil) {
            // Erfolg
            println(jsonResult)

            let dataArray = jsonResult["contacts"] as! NSArray;

            for item in dataArray { // Schleife durch Datenpunkte

                let obj = item as! NSDictionary

                for (key, value) in obj {

                    println("Schlüssel: \(key) - Wert: \(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 {
            // Fehler
            println("Fehler")
        }

    })
}

Abgeschlossen

3voto

Ich rufe das JSON bei Klick auf die Schaltfläche Anmeldung auf

@IBAction func loginClicked(sender : AnyObject) {

    var request = NSMutableURLRequest(URL: NSURL(string: kLoginURL)) // Hier enthält kLogin die Login-API.

    var session = NSURLSession.sharedSession()

    request.HTTPMethod = "POST"

    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(self.criteriaDic(), options: nil, error: &err) // Diese Zeile füllt den Webdienst mit den erforderlichen Parametern.
    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("Erfolg: \(success)")
        }
    })

    task.resume()
}

Hier habe ich ein separates Dictionary für die Parameter erstellt.

var params = ["format":"json", "MobileType":"IOS","MIN":"f8d16d98ad12acdbbe1de647414495ec","UserName":emailTxtField.text,"PWD":passwordTxtField.text,"SigninVia":"SH"]as NSDictionary
    return params
}

// Hier können Sie Ihre eigenen Parameter-Sets hinzufügen.

3voto

Oded Breiner Punkte 26754

KISS Antwort:

URLSession.shared.dataTask(with: URL(string: "https://google.com")!) {(data, response, error) in
    print(String(data: data!, encoding: .utf8))
}.resume()

2voto

Daniel Duan Punkte 2465

Sie können Just verwenden, eine HTTP-Bibliothek im Stil von python-requests.

Einige Beispiele zum Senden von HTTP-Anfragen mit Just:

// Synchrone GET-Anfrage mit URL-Abfrage a=1
let r = Just.get("https://httpbin.org/get", params:["a":1])

// Asynchrone POST-Anfrage mit Formularwert und Datei-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) { /* Erfolg! */ }
}

In beiden Fällen kann auf das Ergebnis einer Anfrage r ähnlich wie bei python-request zugegriffen werden:

r.ok            // Ist die Antwort erfolgreich?
r.statusCode    // Statuscode der Antwort
r.content       // Antwortkörper als NSData?
r.text          // Antwortkörper als Text?
r.json          // Antwortkörper geparst durch NSJSONSerialization

Weitere Beispiele finden Sie in diesem Spielplatz

Die Verwendung dieser Bibliothek im synchrone Modus in einem Playground ist das Nächste, was man in Swift zu cURL bekommen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X