iOS NSMutableURLRequest 授权Header
iOS NSMutableURLRequest Authorization Header
我在访问 API 呼叫时遇到问题,我认为这与授权 header 有关。我正在使用 AlamoFire 并打印出令牌,所以我知道它是有效的。
var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString + path)!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = method.rawValue
println(Router.OAuthToken)
if let token = Router.OAuthToken {
mutableURLRequest.setValue("Token token=\(token)", forHTTPHeaderField: "Authorization")
}
println(mutableURLRequest)
switch self {
default:
return mutableURLRequest
}
}
这就是文档所说的,它在终端中使用授权令牌就可以正常工作:
curl -H "Authorization: Token token=<ACCESS_TOKEN>" http://10x.xx.xx.xxx/api/v1/users/feed
这是我收到的错误:
Optional(Error Domain=com.alamofire.error Code=-1 "The operation couldn’t be completed. (com.alamofire.error error -1.)")
import Foundation
import Alamofire
import CoreData
enum Router: URLRequestConvertible {
static let baseURLString = "http://104.131.81.230/api/v1"
static var OAuthToken: String?
case UserProfile
case FacebookAuth(String)
case Classes
var method: Alamofire.Method {
switch self {
case .UserProfile:
return .POST
case .FacebookAuth:
return .POST
case .Classes:
return .POST
}
}
var path: String {
switch self {
case UserProfile:
return "/users/me"
case FacebookAuth(let fbAuthToken):
return "/authentications/?access_token=\(fbAuthToken)"
case Classes:
return "/classes/"
}
}
var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString + path)!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = method.rawValue
println(Router.OAuthToken)
if let token = Router.OAuthToken {
println("got token")
mutableURLRequest.setValue("Token token=<\(token)>", forHTTPHeaderField: "Authorization")
}
println(mutableURLRequest)
switch self {
default:
return mutableURLRequest
}
}
}
Alamofire.request(Router.Classes).validate(statusCode: 200 ..< 300).responseJSON(completionHandler: { (request, response, JSON, error) in
println(JSON)
println(error)
if let _json = JSON as? [Dictionary<String, AnyObject>] {
println(_json)
for json in _json {
}
}
})
这是使用 debugPrintln() 打印出的 Alamofire 请求,我收到 404 错误。
$ curl -i \
-X POST \
-H "Authorization: Token token=f804414300d84a929b7cec4148fcfd7f" \
-H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \
-H "Accept-Encoding: gzip;q=1.0,compress;q=0.5" \
-H "User-Agent: xxx/com.xxx.xxxx (1; OS Version 8.4 (Build 12H141))" \
"http://10X.XXX.XX.XX/api/v1/classes/"
您收到错误消息是因为您很可能收到来自服务器的 401 响应,这导致状态代码验证失败。我建议打印出您收到的 response
。这很可能会显示带有 401 状态代码的身份验证问题。
这里对您有帮助的是使用 Alamofire 中的 debugPrintln(request)
功能来调试正在生成的 cURL
命令。我猜 Authorization header 没有按照您预期的方式组装。您应该尝试以下操作:
let request = Alamofire.request(Router.Classes)
.responseJSON { request, response, json, error in
println(request)
println(response)
println(json)
println(error)
}
debugPrintln(request)
这应该可以帮助您调试最有可能收到 401 响应的原因。如果您可以尝试一下并回复我,我会相应地更新我的答案。
祝你好运!
我在访问 API 呼叫时遇到问题,我认为这与授权 header 有关。我正在使用 AlamoFire 并打印出令牌,所以我知道它是有效的。
var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString + path)!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = method.rawValue
println(Router.OAuthToken)
if let token = Router.OAuthToken {
mutableURLRequest.setValue("Token token=\(token)", forHTTPHeaderField: "Authorization")
}
println(mutableURLRequest)
switch self {
default:
return mutableURLRequest
}
}
这就是文档所说的,它在终端中使用授权令牌就可以正常工作:
curl -H "Authorization: Token token=<ACCESS_TOKEN>" http://10x.xx.xx.xxx/api/v1/users/feed
这是我收到的错误:
Optional(Error Domain=com.alamofire.error Code=-1 "The operation couldn’t be completed. (com.alamofire.error error -1.)")
import Foundation
import Alamofire
import CoreData
enum Router: URLRequestConvertible {
static let baseURLString = "http://104.131.81.230/api/v1"
static var OAuthToken: String?
case UserProfile
case FacebookAuth(String)
case Classes
var method: Alamofire.Method {
switch self {
case .UserProfile:
return .POST
case .FacebookAuth:
return .POST
case .Classes:
return .POST
}
}
var path: String {
switch self {
case UserProfile:
return "/users/me"
case FacebookAuth(let fbAuthToken):
return "/authentications/?access_token=\(fbAuthToken)"
case Classes:
return "/classes/"
}
}
var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString + path)!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = method.rawValue
println(Router.OAuthToken)
if let token = Router.OAuthToken {
println("got token")
mutableURLRequest.setValue("Token token=<\(token)>", forHTTPHeaderField: "Authorization")
}
println(mutableURLRequest)
switch self {
default:
return mutableURLRequest
}
}
}
Alamofire.request(Router.Classes).validate(statusCode: 200 ..< 300).responseJSON(completionHandler: { (request, response, JSON, error) in
println(JSON)
println(error)
if let _json = JSON as? [Dictionary<String, AnyObject>] {
println(_json)
for json in _json {
}
}
})
这是使用 debugPrintln() 打印出的 Alamofire 请求,我收到 404 错误。
$ curl -i \
-X POST \
-H "Authorization: Token token=f804414300d84a929b7cec4148fcfd7f" \
-H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \
-H "Accept-Encoding: gzip;q=1.0,compress;q=0.5" \
-H "User-Agent: xxx/com.xxx.xxxx (1; OS Version 8.4 (Build 12H141))" \
"http://10X.XXX.XX.XX/api/v1/classes/"
您收到错误消息是因为您很可能收到来自服务器的 401 响应,这导致状态代码验证失败。我建议打印出您收到的 response
。这很可能会显示带有 401 状态代码的身份验证问题。
这里对您有帮助的是使用 Alamofire 中的 debugPrintln(request)
功能来调试正在生成的 cURL
命令。我猜 Authorization header 没有按照您预期的方式组装。您应该尝试以下操作:
let request = Alamofire.request(Router.Classes)
.responseJSON { request, response, json, error in
println(request)
println(response)
println(json)
println(error)
}
debugPrintln(request)
这应该可以帮助您调试最有可能收到 401 响应的原因。如果您可以尝试一下并回复我,我会相应地更新我的答案。
祝你好运!