2015-07-08 4 views
0

Я борюсь за то, чтобы заставить это работать, чтобы сделать запрос к моему API. Без токенов работает, но когда я пытаюсь добавить дополнительные заголовки, для меня все осложняется.Аутентифицированный http-запрос swift Alamofire

Во-первых, структура. один класс под названием: 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

Я как бы новый, чтобы быстро, поэтому примеры были бы очень оценены! Спасибо!

+0

Следует ли хранить ссылки на менеджера. Я не уверен, но вы могли бы это проверить. – Sandeep

+0

Предлагаемые действия? Я не уверен, как я сделаю это слабым справки. – CularBytes

ответ

2

Таким образом, большинство вашего кода выглядит прочным.

Ошибка приводит меня к мысли, что CFNetwork испытывает трудности при определении того, как вычислить пространство защиты для задачи. Я также предполагаю, что вы получаете базовый вызов auth, так как вы присоединяете заголовок Authorization.

Копаясь в вашей логике, немного больше с этим соображением заставил меня увидеть, что вы не прикрепляете свой token к строке правильно внутри заголовка Authorization. Вам нужно сделать следующее.

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

В противном случае ваше Authorization значение заголовка будет включать Optional(value) вместо просто value.

Это единственная проблема, которую я вижу на данный момент. Если бы вы могли дать эту попытку и комментарий, это было бы здорово.Я буду обновлять свой ответ соответственно, если это не решит вашу проблему.

Удачи!

+0

привет вскользь, спасибо, что нашли время, чтобы попытаться выяснить, что не так. Кроме того, спасибо, что рассказали мне, что мой код выглядит довольно солидно. Я действительно получаю автоответчик. Тем временем я потратил время на вход в систему, таким образом получив реальный токен доступа. Поэтому я просто попробовал, с вашим ответом, с реальным действительным токеном доступа, и он работает! Это .. мало! сделал трюк. ОДНАКО: Я проверял, было ли это просто удачей, потому что теперь это действительный токен доступа, оказывается, что если он недействителен или истек, он все равно бросает ту же ошибку :( – CularBytes

+0

так, длинный рассказ короткий, '!' требуется, но вместо 401 http-кода, когда недопустимый токен доступа илистек, я получаю то же самое исключение. – CularBytes

0

Вы можете добавить свои заголовки в свой запрос с помощью Alamofire 2 и Swift 2.

Для примера: go to example

+0

проверили ли он, если оно вызывает исключение, когда токен недействителен? Или он возвращает 401? – CularBytes

+0

Я обработал ошибку на на стороне сервера. Мой заголовок «Авторизация» приближается к нулю. Теперь он работает. – fatihyildizhan

+0

Я имею в виду: когда токен, который вы устанавливаете в заголовке, недействителен или истек, будет ли он выходить из строя/исключать или будет возвращаться 401? – CularBytes