如何解包NSJSONSerialization.dataWithJSONObject optional()?

时间:2014-12-16 00:45:43

标签: swift

我试图在Swift中发送POST请求

let url = NSURL(string: "https://api.example.com/token")

let request:NSMutableURLRequest = NSMutableURLRequest(URL: url!)
var session = NSURLSession.sharedSession()

request.HTTPMethod = "POST"

request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

let params = ["client_id":client_id, "redirect_uri":redirect_uri, "client_secret":client_secret, "code":code, "grant_type":"authorization_code"] as Dictionary<String, AnyObject>
var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
println(request.HTTPBody)

var task = session.dataTaskWithRequest(request, ...

当我println(request.HTTPBody)时,我将NSDATA包装在一个可选的

Optional(<7b22636f 6465223a 22765930 6b575348...)

我得到的回应表明,api并不理解身体,因为它表明&#34;所需的\&#34; client_id \&#34;参数缺失&#34;

如何解包NSJSONSerialization.dataWithJSONObject可选?

〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜=〜

修改 我进一步挖掘并专注于HTTPBody线:

let params = ["client_id":client_id, "redirect_uri": redirect_uri, "client_secret":client_secret, "code":code, "grant_type":"authorization_code"] as Dictionary<String, AnyObject>
var err: NSError?
let body = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)!
request.HTTPBody = body
println(body)
println(request.HTTPBody)

println(body)打印出一个未包装的变量... <7b22636f 6465223a 224a4e46 316f4a48 println(request.HTTPBody)是可选的...... Optional(<7b22636f 6465223a 224a4e46 316f4a48

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

运算符将可选类型解包为各自的非可空类型。这条线     let body = NSJSONSerialization.dataWithJSONObject(params,options:nil,error:&amp; err)!

为body分配一个 NSData 对象,从预期的返回类型 NSData

中解包

request.HTTPBody的类型是 NSData?,所以这一行

request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)!

从NSJSONSerialization.dataWithJSONObject中取消 NSData?返回以键入 NSData ,只是放回 NSData?类型的容器中。可选的 NSData?容器当然可以包含 NSData 值,但对request.HTTPBody的任何引用都将返回 NSData?

如果您想删除request.HTTPBody的可选包装,您必须在想要表达它时将其打开。

println(request.HTTPBody!)

或者如上所述,在本地存储未包装的版本并引用该变量!

let body = request.HTTPBody!
println(body)

答案 1 :(得分:1)

  

当我println(request.HTTPBody)时,我将NSDATA包装在一个可选的

这里没有错误或问题。请参阅文档。 NSMutableURLRequest的HTTPBody 包含在Optional中的NSData。发生了什么正是你应该期待的。

如果你有问题,那很好,找出它是什么并询问它;但这不是。