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?
Antworten
Zu viele Anzeigen?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)")
}
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
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.
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.