Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 经过身份验证的http请求swift Alamofire_Ios_Swift_Alamofire_Swift2_Xcode7 - Fatal编程技术网

Ios 经过身份验证的http请求swift Alamofire

Ios 经过身份验证的http请求swift Alamofire,ios,swift,alamofire,swift2,xcode7,Ios,Swift,Alamofire,Swift2,Xcode7,我正在努力让它工作,以向我的API发出请求。没有令牌就可以工作,但当我尝试添加额外的头时,事情就变得复杂了 第一,结构。 一个名为:apisynctask的类发出请求 一个名为APIParams的类,只是将参数发送到apisynctask类的数据持有者 一个名为DatabaseAPI的类,用于生成参数,并将其发送到APIAsyncTask类 数据库API func someMethod() { let task = APIAsyncTasks() task.registerCal

我正在努力让它工作,以向我的API发出请求。没有令牌就可以工作,但当我尝试添加额外的头时,事情就变得复杂了

第一,结构。 一个名为:apisynctask的类发出请求

一个名为APIParams的类,只是将参数发送到apisynctask类的数据持有者

一个名为DatabaseAPI的类,用于生成参数,并将其发送到APIAsyncTask类

数据库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)
}
APIsyncTask

此部分用于修复另一个错误,因为manager不是全局的,所以任务很快被取消

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
因此,正如代码所示,我在完成时遇到了一个错误:

Mattt自己使用
Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders的习惯
,所以应该没问题

据博客称,我怀疑这和多线程有关。或者,因为它与CFNetwork有关,可能是因为我的API不使用SSL?我禁用了NSAppTransportSecurity


我对斯威夫特有点陌生,所以我非常感谢你的例子!谢谢

因此大部分代码看起来都很可靠

这个错误让我相信CFNetwork很难计算出如何计算挑战的保护空间。我还假设您正在接受一个基本的身份验证挑战,因为您正在附加一个
Authorization

考虑到这一点,再仔细研究一下您的逻辑,我发现您没有将
令牌
正确地附加到
授权
头中的字符串。您需要执行以下操作

defaultHeaders["Authorization"] = "bearer \(token!)"
否则,您的
授权
标题值将包括
可选(值)
,而不仅仅是

这是我目前唯一能看到的问题。如果你能尝试一下并回复评论,那就太好了。如果这不能解决你的问题,我会相应地更新我的答案


祝你好运

您可以使用
Alamofire 2
Swift 2
在请求中添加标题


例如:

您是否应该保持对经理的强烈引用。我不确定,但你能检查一下建议的行动吗?我不知道如何才能使它成为一个弱的参考..嗨,cnoon,谢谢你花时间试着找出问题所在。另外,谢谢你告诉我我的代码看起来很可靠。我确实得到了一份授权证书。与此同时,我花时间登录,因此获得了一个真正的访问令牌。所以我只是用你的答案,用一个真正有效的访问令牌,试了一下,效果很好!那个一点儿!我成功了。。但是:我检查它是否只是运气,因为它现在是一个有效的访问令牌,如果它无效或过期,它仍然抛出相同的错误:(因此,长话短说,
是必需的,但是当访问令牌无效或过期时,我得到的不是401 http代码,而是相同的异常。您是否测试了令牌无效时它是否引发异常?或者它是否返回401?我在服务器端处理了错误。我的标题为“授权”是空的。现在它正在工作。我的意思是:当你在标题中设置的令牌无效或过期时,它会崩溃/抛出异常还是返回401?不,什么都没有发生,这就是为什么我很难找到发生了什么。