Swift and Put request example for RESTful API

I am trying to learn Swift by creating an OSX application for the Phillips Hue light API. However, and I feel stupid here, I can’t even get a simple work example. I use this library in X Code 6.1: https://github.com/hallas/agent

Here is the code I'm using:

import Foundation let done = { (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in // react to the result of your request }; Agent.put("/api/[username]/lights/2/state", headers: [ "Header": "Value" ], data: [ "hue": 35000 ], done: done) 

Needless to say, he does nothing. What am I doing wrong?

+5
source share
3 answers

This is an example of a PUT operation using a simple class to port HTTP functions:

  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 } } 
+6
source

Before you delve into your code. Please make sure that you follow the getting started guide from the shades developer web page http://www.developers.meethue.com/documentation/getting-started

Special:

 1. Find out your bridge ip address. The most simple way could be checking on your router. 2. Open http://bridge_ip_address/debug/clip.html. You'll get a simple client. Try stuffs there. 

After you have tested this, you can change it in the clip. Then go back to your quick code. As @nickgraef pointed out in the comments. The endpoint should be: http: // bridge_ip_address / api / [username] / lights / 2 / state.

 Agent.put("http://bridge_ip_address/api/[username]/lights/2/state", headers: [ "Header": "Value" ], data: [ "hue": 35000 ], done: nil) 
+1
source

Swift 2 example

  let url = NSURL(string: "https://yourUrl.com") //Remember to put ATS exception if the URL is not https let request = NSMutableURLRequest(URL: url!) request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") //Optional request.HTTPMethod = "PUT" let session = NSURLSession(configuration:NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: nil) let data = " username=self@gmail.com &password=password".dataUsingEncoding(NSUTF8StringEncoding) request.HTTPBody = data let dataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in if error != nil { //handle error } else { let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) print("Parsed JSON: '\(jsonStr)'") } } dataTask.resume() 
+1
source

Source: https://habr.com/ru/post/1205724/


All Articles