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

时间:2015-07-08 09:48:43

标签: ios swift alamofire swift2 xcode7

我正在努力让这个工作来向我的API发出请求。没有令牌工作,但当我尝试添加额外的标题时,事情变得复杂,对我来说。

首先,结构。 一个名为: APIAsyncTask 的类,它发出请求

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

一个名为 DatabaseAPI 的类,它构建参数,并将其发送到 APIAsyncTask 类。

DatabaseAPI

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

因此,现在代码,我在完成时遇到错误:

runtime error

Mattt本人gives the answer使用Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ,所以应该没问题......

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

我对swift很新,所以我非常感谢你的例子!三江源!

2 个答案:

答案 0 :(得分:2)

因此,您的大多数代码看起来都很可靠。

这个错误让我相信CFNetwork很难弄清楚如何为挑战计算保护空间。我还假设你正在获得一个基本的auth挑战,因为你附加了Authorization标题。

在考虑到这一点的情况下进一步深入了解您的逻辑后,我发现您没有在token标题内正确地将Authorization附加到字符串中。您需要执行以下操作。

defaultHeaders["Authorization"] = "bearer \(token!)"

否则,Authorization标头值将包含Optional(value),而不仅仅是value

这是我目前唯一可以看到的问题。如果你可以尝试并回顾那将是伟大的。如果这实际上没有解决你的问题,我会相应地更新我的答案。

祝你好运!

答案 1 :(得分:0)

您可以使用.LFB13: xorl %esi, %esi movl $1, %ecx .L2: movq %rcx, %rax andl $3735928559, %eax orq %rax, %rsi salq $3, %rcx // implicit test for 0 jne .L2 movl $.LC0, %edi xorl %eax, %eax jmp printf Alamofire 2

在请求中添加标题

例如:go to example