似乎问题是内容类型应该是
application/x-www-form-urlencoded
而不是
application/json
,同样,使用这种内容类型发送参数的方式也发生了一些变化。
我做了一个小测试,这个代码对我很有用:
static func generateAccessToken() {
let params = ["client_id": "your_id",
"client_secret": "your_client_secret",
"grant_type": "authorization_code",
"redirect_uri": "http://tolkianaa.blogspot.com/",
"code": "the_code"]
guard let url = NSURL(string: "https://api.instagram.com/oauth/access_token") else {
return
}
let request = NSMutableURLRequest(URL: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
let stringParams = params.paramsString()
let dataParams = stringParams.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
let paramsLength = String(format: "%d", dataParams!.length)
request.setValue(paramsLength, forHTTPHeaderField: "Content-Length")
request.HTTPBody = dataParams
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
var json: AnyObject = [:]
guard let data = data else {
return
}
do {
json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
} catch {
}
print(json)
}
task.resume()
}
为了获取字符串形式的参数,我做了以下扩展:
extension Dictionary {
func paramsString() -> String {
var paramsString = [String]()
for (key, value) in self {
guard let stringValue = value as? String, let stringKey = key as? String else {
return ""
}
paramsString += [stringKey + "=" + "\(stringValue)"]
}
return (paramsString.isEmpty ? "" : paramsString.joinWithSeparator("&"))
}
}
希望能有所帮助!