Cocoa RESTful API的Swift和Put请求示例
我试图通过为Phillips Hue light API创建一个OSX应用程序来学习Swift。然而,我觉得这里很傻,我甚至不能让一个简单的例子工作。我在X代码6.1中使用此库: 以下是我使用的代码:Cocoa RESTful API的Swift和Put请求示例,cocoa,rest,swift,philips-hue,Cocoa,Rest,Swift,Philips Hue,我试图通过为Phillips Hue light API创建一个OSX应用程序来学习Swift。然而,我觉得这里很傻,我甚至不能让一个简单的例子工作。我在X代码6.1中使用此库: 以下是我使用的代码: import Foundation let done = { (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in // react to the result of you
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)
不用说它什么也没做。我做错了什么?在深入研究代码之前。请确保您遵循了hue开发者网页上的入门指南 特别是:
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.
测试后,可以在剪辑中进行更改。然后回到你的swift密码。
正如评论中提到的@nickgraef。端点应该是:http://bridge\u ip\u 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)
这是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
}
}
let url=NSURL(字符串:http://example.com")
let text=“要放置的文本”
var myData:NSData?=text.dataUsingEncoding(NSUTF8StringEncoding)
var headers=Dictionary()
Http()
如果结果是成功{
如果让jsonObject:AnyObject=result.jsonObject{
println(jsonObject)
}
}
}
类Http{
func put(url:NSURL,头:Dictionary,数据:NSData,completionHandler:((结果:HttpResult)->Void)!){
操作(“PUT”,url:url,headers:headers,data:data){(结果)在
completionHandler(结果:result)
}
}
func操作(动词:字符串,url:NSURL,标题:字典,数据:NSData,completionHandler:((结果:HttpResult)->Void)!){
让httpRequest=NSMutableURLRequest(URL:URL)
httpRequest.HTTPMethod=动词
对于页眉中的(headerKey,headerValue){
httpRequest.setValue(headerValue,用于HttpHeaderField:headerKey)
}
让task=NSURLSession.sharedSession().uploadTaskWithRequest(httpRequest,fromData:data){(数据,响应,错误)在
completionHandler(结果:HttpResult(数据:数据,请求:httpRequest,响应:响应,错误:错误))
}
task.resume()
}
}
类HttpResult{
var请求:NSURLRequest
var响应:NSHTTPURLResponse?
var数据:NSData?
var错误:N错误?
变量状态代码:Int=0
var成功:Bool=false
变量头:字典{
得到{
如果让responseValue=响应{
返回responseValue.allHeaderFields作为字典
}
否则{
返回字典()
}
}
}
初始化(数据:NSData?,请求:NSURLRequest,响应:NSURLResponse?,错误:NSError?){
self.data=数据
self.request=请求
self.response=作为NSHTTPURLRResponse的响应?
self.error=错误
自我成功=错误
如果错误!=nil{
println(“Http.\(request.HTTPMethod!):\(request.URL)”)
println(“错误:\(错误!.localizedDescription)”)
}
否则{
如果let responseValue=self.response{
statusCode=responseValue.statusCode
如果状态代码>=200&&statusCode<300{
成功=正确
}
否则{
println(“Http.\(request.HTTPMethod!)\(request.URL)”)
println(“状态:\(状态代码)”)
如果让jsonError:AnyObject=jsonObject{
变量错误:n错误?
var errData=NSJSONSerialization.dataWithJSONObject(jsonError,选项:NSJSONWritingOptions.prettypted,错误:&err)
var errMessage=NSString(数据:errData!,编码:NSUTF8StringEncoding)
println(“错误:\(errMessage)”)
}
}
}
}
}
var jsonObject:AnyObject{
var resultJsonObject:AnyObject?
var jsonError:n错误?
如果let contentType=headers[“Content Type”]{
如果contentType.contains(“应用程序/json”){
resultJsonObject=NSJSONSerialization.JSONObjectWithData(data!,选项:.AllowFragments,错误:&jsonError)作为任何对象?
}
}
返回结果JSONObject
}
}
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()
你怎么知道它什么也没做呢?我正在使用Phillips Hue的网络界面,对所有灯泡的状态进行获取。数字没有改变。您的
完成
关闭是空的;可能是Agent.put()
它正在报告错误?如果出现错误,请使用null{/*打印内容;调试器中断;etc*/}
您需要完整的URL<代码>“/api/[username]/lights/2/state”没有域。另外,删除无关的标题
参数;您当前正在发送示例值。您需要定义协议,因此,如果它是基于web的服务,URI将以http://
或https://
Ack开头,很抱歉,我以为您想直接输入,只是看到您的问题看起来与SDK有关。是的,使用REST API输入非常有用,它只是不特定于Phillips Hue。为什么不为数据使用[String:AnyObject]类型?