【问题标题】:Example of Swift and a Put request for a RESTful APIRESTful API 的 Swift 和 Put 请求示例
【发布时间】:2014-10-28 20:12:31
【问题描述】:

我正在尝试通过为 Phillips Hue light API 创建一个 OSX 应用来学习 Swift。但是,我在这里感到很傻,我什至无法获得一个简单的示例。我在 X Code 6.1 中使用这个库: https://github.com/hallas/agent

这是我正在使用的代码:

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)

不用说它什么也没做。我做错了什么?

【问题讨论】:

  • 你怎么知道它什么也没做?
  • 我正在使用 Phillips Hue Web 界面,并对所有灯泡的状态进行 GET。数字没有改变。
  • 您的done 闭包是空的;也许Agent.put() 是报错?使用if error != null { /* print something; debugger break; etc */ }
  • 您需要一个完整的 URL。 "/api/[username]/lights/2/state" 没有域。另外,删除无关的headers 参数;您当前正在发送示例值。
  • 你需要定义协议,所以如果是基于web的服务,URI将以http://https://开头

标签: cocoa rest swift philips-hue


【解决方案1】:

这是一个 PUT 操作的示例,使用一个简单的类来包装 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
}    
}

【讨论】:

  • Ack,对不起,我以为你想做直接 PUT,只是看到你的问题看起来像是 Hue SDK 特定的。
  • 是的,做一个 REST API PUT 效果很好,只是它不是 Phillips Hue 特有的。
【解决方案2】:

在深入研究代码之前。请确保您遵循了hue开发者网页http://www.developers.meethue.com/documentation/getting-started的入门指南

特别是:

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.

在你测试之后,你可以在剪辑中进行更改。然后回到你的快速代码。 正如 cmets 中提到的@nickgraef。端点应该是:http://bridge_ip_address/api/[用户名]/lights/2/state。

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

【讨论】:

    【解决方案3】:

    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 = "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()
    

    【讨论】:

    • 为什么不使用 [String: AnyObject] 类型的数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2013-05-25
    • 2017-02-19
    • 2019-05-25
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多