我试图在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
我该如何解决这个问题?
答案 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。发生了什么正是你应该期待的。
如果你有问题,那很好,找出它是什么并询问它;但这不是。