经过身份验证的 http 请求 swift Alamofire
Authenticated http request swift Alamofire
我正在努力让它工作以向我的 API 提出请求。没有令牌可以工作,但是当我尝试添加额外的 headers 时,对我来说事情变得复杂了。
首先,结构。
一个 class 调用:APIAsyncTask 发出请求
一个 class 称为 APIParams,只是一个数据持有者,用于将参数发送到 APIAsyncTask class.
一个 class 调用了 DatabaseAPI 构建参数,并将其发送到 API AsyncTask class.
数据库API
func someMethod()
{
let task = APIAsyncTasks()
task.registerCallback { (error, result) -> Void in
print("Finished task, back at DatabaseAPI")
}
let params2 = APIParams(request: .GET, apiPath: "Posts/1", apiToken: "4iTX-56w")
task.APIrequest(params2)
}
APIAsyncTask
这部分是为了修复另一个错误,因为管理器不是全局的,任务很快就被取消了。
var manager : Manager!
init(authenticatedRequest : Bool, token: String?)
{
manager = Alamofire.Manager()
print("Pre \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
if(authenticatedRequest && token != nil)
{
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders!
defaultHeaders["Authorization"] = "bearer \(token)"
let configuration = Manager.sharedInstance.session.configuration
configuration.HTTPAdditionalHeaders = defaultHeaders
manager = Alamofire.Manager(configuration: configuration)
}
print("Post \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
}
经过一番决策,归结为这部分。
private func GetRequest(url: String!,token : String?, completionHandler: (JSON?, NSURLRequest?, NSHTTPURLResponse?, NSError?) -> () ) -> ()
{
print("Begin Get Request")
if(token != nil)//if token is not nil, make authenticated request
{
print("just before request: \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
manager.request(.GET, url, parameters: nil, encoding: .JSON).responseJSON { (request, response, json, error) in
print("Get Request (authenticated), inside alamofire request")
var resultJson : JSON?
if(json != nil)
{
resultJson = JSON(json!)
}
completionHandler(resultJson, request, response, error)
}
}
else
{
//working part without token
所以现在的代码是,我在完成时遇到错误:
马特本人 gives the answer 使用 Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders
, 这样应该没问题...
根据 this 博客,我怀疑它与多线程有关。或者,因为它是关于 CFNetwork 的,可能是因为我的 API 没有使用 SSL?我禁用了 NSAppTransportSecurity
我是 swift 的新手,所以非常感谢示例!谢谢!
所以你的大部分代码看起来都很可靠。
这个错误让我相信 CFNetwork 很难弄清楚如何计算挑战的保护 space。我还假设您正在接受基本的身份验证挑战,因为您附加了 Authorization
header.
考虑到这一点,进一步挖掘您的逻辑让我看到您没有将 token
正确地附加到 Authorization
header 中的字符串。您需要改为执行以下操作。
defaultHeaders["Authorization"] = "bearer \(token!)"
否则您的 Authorization
header 值将包括 Optional(value)
而不仅仅是 value
.
这是我目前唯一能看到的问题。如果您可以尝试一下并回复评论,那就太好了。如果这不能真正解决您的问题,我会相应地更新我的答案。
祝你好运!
您可以在 Alamofire 2
和 Swift 2
的请求中添加 headers。
举个例子:go to example
我正在努力让它工作以向我的 API 提出请求。没有令牌可以工作,但是当我尝试添加额外的 headers 时,对我来说事情变得复杂了。
首先,结构。 一个 class 调用:APIAsyncTask 发出请求
一个 class 称为 APIParams,只是一个数据持有者,用于将参数发送到 APIAsyncTask class.
一个 class 调用了 DatabaseAPI 构建参数,并将其发送到 API AsyncTask class.
数据库API
func someMethod()
{
let task = APIAsyncTasks()
task.registerCallback { (error, result) -> Void in
print("Finished task, back at DatabaseAPI")
}
let params2 = APIParams(request: .GET, apiPath: "Posts/1", apiToken: "4iTX-56w")
task.APIrequest(params2)
}
APIAsyncTask
这部分是为了修复另一个错误,因为管理器不是全局的,任务很快就被取消了。
var manager : Manager!
init(authenticatedRequest : Bool, token: String?)
{
manager = Alamofire.Manager()
print("Pre \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
if(authenticatedRequest && token != nil)
{
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders!
defaultHeaders["Authorization"] = "bearer \(token)"
let configuration = Manager.sharedInstance.session.configuration
configuration.HTTPAdditionalHeaders = defaultHeaders
manager = Alamofire.Manager(configuration: configuration)
}
print("Post \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
}
经过一番决策,归结为这部分。
private func GetRequest(url: String!,token : String?, completionHandler: (JSON?, NSURLRequest?, NSHTTPURLResponse?, NSError?) -> () ) -> ()
{
print("Begin Get Request")
if(token != nil)//if token is not nil, make authenticated request
{
print("just before request: \(manager.session.configuration.HTTPAdditionalHeaders?.count)")
manager.request(.GET, url, parameters: nil, encoding: .JSON).responseJSON { (request, response, json, error) in
print("Get Request (authenticated), inside alamofire request")
var resultJson : JSON?
if(json != nil)
{
resultJson = JSON(json!)
}
completionHandler(resultJson, request, response, error)
}
}
else
{
//working part without token
所以现在的代码是,我在完成时遇到错误:
马特本人 gives the answer 使用 Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders
, 这样应该没问题...
根据 this 博客,我怀疑它与多线程有关。或者,因为它是关于 CFNetwork 的,可能是因为我的 API 没有使用 SSL?我禁用了 NSAppTransportSecurity
我是 swift 的新手,所以非常感谢示例!谢谢!
所以你的大部分代码看起来都很可靠。
这个错误让我相信 CFNetwork 很难弄清楚如何计算挑战的保护 space。我还假设您正在接受基本的身份验证挑战,因为您附加了 Authorization
header.
考虑到这一点,进一步挖掘您的逻辑让我看到您没有将 token
正确地附加到 Authorization
header 中的字符串。您需要改为执行以下操作。
defaultHeaders["Authorization"] = "bearer \(token!)"
否则您的 Authorization
header 值将包括 Optional(value)
而不仅仅是 value
.
这是我目前唯一能看到的问题。如果您可以尝试一下并回复评论,那就太好了。如果这不能真正解决您的问题,我会相应地更新我的答案。
祝你好运!
您可以在 Alamofire 2
和 Swift 2
的请求中添加 headers。
举个例子:go to example