2014-10-28 14 views
5

Tôi đang cố gắng tìm hiểu Swift bằng cách tạo một ứng dụng OSX cho API ánh sáng Phillips Hue. Tuy nhiên, và tôi cảm thấy ngớ ngẩn ở đây, tôi thậm chí không thể có được một ví dụ đơn giản làm việc. Tôi đang sử dụng thư viện này trong X Mã 6.1: https://github.com/hallas/agentVí dụ về Swift và yêu cầu Đặt một RESTful API

Dưới đây là đoạn code tôi đang sử dụng:

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) 

Không cần phải nói bất cứ điều gì nó không làm. Tôi đang làm gì sai?

+0

Làm thế nào để bạn biết rằng nó là đang không làm gì cả? – GoZoner

+0

Tôi đang sử dụng giao diện web Phillips Hue và thực hiện GET cho trạng thái của tất cả các bóng đèn. Các con số không thay đổi. –

+2

Đóng cửa 'done' của bạn trống; có lẽ 'Agent.put()' nó đang báo cáo một lỗi? Sử dụng 'if error! = Null {/ * in một cái gì đó; ngắt trình gỡ lỗi; etc * /} ' – GoZoner

Trả lời

6

Đây là một mẫu của một hoạt động PUT, sử dụng một lớp đơn giản để quấn các chức năng 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 
}  
} 
+0

Ack, xin lỗi tôi nghĩ bạn muốn thực hiện một PUT thẳng, nhìn thấy câu hỏi của bạn trông cụ thể cho Hue SDK. – Lee

+0

Tôi không thể sử dụng mã của bạn cho vấn đề của tôi? –

+0

Có, nó sẽ hoạt động rất tốt để thực hiện REST API PUT, nó không chỉ dành riêng cho Phillips Hue. – Lee

1

Trước khi bạn tìm hiểu mã của mình. Hãy chắc chắn rằng bạn làm theo các hướng dẫn bắt đầu nhận được từ nhà phát triển màu sắc trang web http://www.developers.meethue.com/documentation/getting-started

Đặc biệt:

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. 

Sau khi bạn kiểm tra mà bạn có thể đưa vào thay đổi trong clip. Sau đó quay lại mã nhanh của bạn. Như @nickgraef được đề cập trong các nhận xét. Điểm cuối phải là: http: // bridge_ip_address/api/[tên người dùng]/đèn/2/trạng thái.

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

Ví dụ với Swift 2

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 = "[email protected]&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() 
+0

tại sao không sử dụng loại [String: AnyObject] cho dữ liệu? –

Các vấn đề liên quan