Questo è un esempio di un'operazione PUT, utilizzando una semplice classe per avvolgere la funzionalità HTTP:
let url = NSURL(string:"http://example.com")
let text = "Text to PUT"
var myData: NSData? = text.dataUsingEncoding(NSUTF8StringEncoding)
var headers = Dictionary<String, String>()
Http().put(url!, headers: headers, data:myData!) { (result) in
if result.success {
if let jsonObject: AnyObject = result.jsonObject {
println(jsonObject)
}
}
}
class Http {
func put(url: NSURL, headers: Dictionary<String, String>, data: NSData, completionHandler: ((result: HttpResult) -> Void)!) {
action("PUT", url: url, headers: headers, data: data) { (result) in
completionHandler(result: result)
}
}
func action(verb: String, url: NSURL, headers: Dictionary<String, String>, data: NSData, completionHandler: ((result: HttpResult) -> Void)!) {
let httpRequest = NSMutableURLRequest(URL: url)
httpRequest.HTTPMethod = verb
for (headerKey, headerValue) in headers {
httpRequest.setValue(headerValue, forHTTPHeaderField: headerKey)
}
let task = NSURLSession.sharedSession().uploadTaskWithRequest(httpRequest, fromData: data) { (data, response, error) in
completionHandler(result: HttpResult(data: data, request: httpRequest, response: response, error: error))
}
task.resume()
}
}
class HttpResult {
var request: NSURLRequest
var response: NSHTTPURLResponse?
var data: NSData?
var error: NSError?
var statusCode: Int = 0
var success: Bool = false
var headers : Dictionary<String, String> {
get {
if let responseValue = response {
return responseValue.allHeaderFields as Dictionary<String,String>
}
else {
return Dictionary<String, String>()
}
}
}
init(data: NSData?, request: NSURLRequest, response: NSURLResponse?, error : NSError?) {
self.data = data
self.request = request
self.response = response as NSHTTPURLResponse?
self.error = error
self.success = false
if error != nil {
println("Http.\(request.HTTPMethod!): \(request.URL)")
println("Error: \(error!.localizedDescription)")
}
else {
if let responseValue = self.response {
statusCode = responseValue.statusCode
if statusCode >= 200 && statusCode < 300 {
success = true
}
else {
println("Http.\(request.HTTPMethod!) \(request.URL)")
println("Status: \(statusCode)")
if let jsonError: AnyObject = jsonObject {
var err: NSError?
var errData = NSJSONSerialization.dataWithJSONObject(jsonError, options:NSJSONWritingOptions.PrettyPrinted, error: &err)
var errMessage = NSString(data: errData!, encoding: NSUTF8StringEncoding)
println("Error: \(errMessage)")
}
}
}
}
}
var jsonObject: AnyObject? {
var resultJsonObject: AnyObject?
var jsonError: NSError?
if let contentType = headers["Content-Type"] {
if contentType.contains("application/json") {
resultJsonObject = NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments, error: &jsonError) as AnyObject?
}
}
return resultJsonObject
}
}
Come fai a sapere che si tratta di non sta facendo niente? – GoZoner
Sto usando l'interfaccia web di Phillips Hue e faccio un GET per lo stato di tutte le lampadine. I numeri non sono cambiati. –
La chiusura 'done' è vuota; forse 'Agent.put()' sta segnalando un errore? Usa 'se errore! = Null {/ * stampa qualcosa; pausa del debugger; ecc * /} ' – GoZoner