как использовать Alamofire с настраиваемыми заголовками

Я только начинаю изучать замечательную новую сетевую библиотеку Alamofire Swift от Мэтта и не совсем уверен, как ее можно использовать с настраиваемыми заголовками.

Код, который я пытаюсь преобразовать из AFNetworking в Alamofire, таков:

let request = NSMutableURLRequest(URL: url)
request.setValue(authorizationToken, forHTTPHeaderField:"Authorization")

person Rene Limberger    schedule 05.08.2014    source источник
comment
defaultHeaders - это изменяемый словарь ([String: String]) заголовков. Я думаю, вы сможете добавить к этому свои заголовки.   -  person Aaron Brager    schedule 05.08.2014


Ответы (10)


Согласно официальной документации, изменение конфигурации сеанса не рекомендуется:

Это не рекомендуется для заголовков Authorization или Content-Type. Вместо этого используйте URLRequestConvertible и ParameterEncoding соответственно.

Итак, пример использования URLRequestConvertible для авторизации:

enum Router: URLRequestConvertible {
    static let baseUrlString = "some url string"

    case Get(query: String)

    var URLRequest: NSMutableURLRequest {
        let (path: String, parameters: [String: AnyObject]?) = {
            switch self {
            case .Get(let query):
                return ("/get", ["q": query])
            }
        }()

        let URL = NSURL(string: Router.baseUrlString)!
        let URLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
        // set header fields
        URLRequest.setValue("a", forHTTPHeaderField: "Authorization")

        let encoding = Alamofire.ParameterEncoding.URL        
        return encoding.encode(URLRequest, parameters: parameters).0
    }
}

и когда вы хотите сделать запрос:

Manager.sharedInstance.request(Router.Get(query: "test"))

Дополнительная информация о URLRequestConvertible: https://github.com/Alamofire/Alamofire#urlrequestconvertible

Старый ответ

Начиная с Alamofire v1.0 Pers ответ больше не работает. В новой версии должны быть добавлены дополнительные заголовки к свойству HTTPAdditionalHeaders NSURLSessionConfiguration

Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["Authorization": authorizationToken]

Подробнее здесь: https://github.com/Alamofire/Alamofire/issues/111

person Nikola Lajic    schedule 26.09.2014
comment
Это работает также для iOS 7? Судя по всему, у меня работает не на iOS 7, только на iOS 8. - person Mihai Panţiru; 29.10.2014
comment
@ MihaiPanţiru он отлично работал на iOS 7, когда я его тестировал. Возможно, последние изменения в Swift что-то сломали. У меня немного времени, поэтому я не могу проверить. - person Nikola Lajic; 30.10.2014
comment
@MrNickBarker есть новости по этому поводу? - person user023; 09.12.2014
comment
Мне кажется странным оборачивать это перечислением - не могли бы вы объяснить, пожалуйста, свое обоснование? РЕДАКТИРОВАТЬ: Да ладно, я понял :) - person manmal; 17.08.2015
comment
@NikolaLajic, можете ли вы указать, о какой версии Alamofire вы имеете в виду? - person Priyal; 06.01.2017

Заголовки, которые меняются от запроса к запросу, можно передать непосредственно методу запроса. Из документации:

Добавление настраиваемого HTTP-заголовка в запрос поддерживается непосредственно в глобальном методе запроса. Это упрощает присоединение заголовков HTTP к запросу, который может постоянно изменяться.

И приведенный пример:

    let headers = [
        "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
        "Content-Type": "application/x-www-form-urlencoded"
    ]

    Alamofire.request(.GET, "https://httpbin.org/get", headers: headers)
             .responseJSON { response in
                 debugPrint(response)
             }

Если, однако, вы хотите установить заголовки, которые не изменяются, рекомендуется сделать это в объекте NSURLConfiguration, как упоминалось здесь другими.

person kcstricks    schedule 30.03.2016

В настоящее время Swift 3.0, Xcode 8.x, Alamofire 4.x:

Вы можете использовать собственный заголовок, как показано ниже:

let headers: HTTPHeaders = [
    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
    "Accept": "application/json"
]

Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in
    debugPrint(response)
}

Для справки

person Nhat Dinh    schedule 12.10.2016
comment
в этом где ваши параметры передачи? - person User558; 23.08.2017

Я создал метод статических заголовков в отдельном классе APIManager.

import Foundation
import Alamofire

class APIManager {

    class func headers() -> HTTPHeaders {
        var headers: HTTPHeaders = [
            "Content-Type": "application/json",
            "Accept": "application/json"
        ]

        if let authToken = UserDefaults.standard.string(forKey: "auth_token") {
            headers["Authorization"] = "Token" + " " + authToken
        }

        return headers
    }
}

И использую в запросах:

Alamofire.request(urlString,
                      method: .get,
                      headers:APIManager.headers())
person Denis Kutlubaev    schedule 17.12.2017

Поскольку мне не нравится устанавливать эти вещи глобально (и иногда я их отправляю, а иногда нет), я написал метод-оболочку для установки заголовков при каждом вызове.

import Alamofire

public class Service: NSObject {

    private class func request(method: Alamofire.Method, URLString: URLStringConvertible, parameters: [String : AnyObject]?, encoding: ParameterEncoding = .URL, headers: [String: String]? = nil) -> Request {

        let (request, error) = encoding.encode(NSURLRequest(URL: NSURL(string: URLString.URLString)!), parameters: parameters)
        let mutableURLRequest = request as! NSMutableURLRequest

        mutableURLRequest.HTTPMethod = method.rawValue

        if let heads = headers {
            for (field, value) in heads {
                mutableURLRequest.setValue(value, forHTTPHeaderField: field)
            }
        }

        return Alamofire.request(mutableURLRequest)
    }
}

Это можно назвать так ...

Service.request(.POST, URLString: "http://httpbin.org/post", parameters: ["example-param": "example-param-value"], encoding: .JSON, headers: ["example-header-field": "example-value"])/*.whatever you want to do with it*/

Это, безусловно, можно было бы очистить с помощью некоторой проверки ошибок, но это должно дать вам суть. Все это основано на Alamofire 1.2.

person Travis    schedule 13.07.2015

ПРИМЕЧАНИЕ: это было до версии 1.0. Это больше не работает. Посмотрите на принятый ответ.


Вы используете свойство defaultHeaders в синглтоне Manager для добавления заголовков, например:

Alamofire.Manager.sharedInstance.defaultHeaders.updateValue(authorizationToken, forKey: "Authorization")

По крайней мере, у меня это работает. :)

person Per Ejeklint    schedule 13.08.2014

Alamofire 4.x, XCode 9.1, Swift 4.x

Когда заголовки вызывают проблемы при отправке их в запросе, нам нужно закодировать параметр, для этого мы выполняем JSONEncoding.prettyPrinted или JSONEncoding.default, например:

let url = "http:\your.url.string\"
let parameter = ["Username":"name", "Password":"123"]
let headers = ["Content-Type" : "application/json"]

Alamofire.request(url, method : .post, parameters : parameter, encoding : JSONEncoding.default , headers : headers).responseData { dataResponse in

     print(dataResponse.request as Any) // your request 
     print(dataResponse.response as Any) // your response
 }
person Pankaj Nigam    schedule 06.12.2017

Установка ниже кода будет работать только в iOS 8 и выше.

Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = headers

Ниже приведен полный код, который работает для iOS 7 и iOS 8.

let URL = NSURL(string: request.url!)
var mutableURLRequest = NSMutableURLRequest(URL: URL!)
mutableURLRequest.HTTPMethod = Alamofire.Method.GET.rawValue

// Adding headers
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders

// Adding parameters
let manager = Alamofire.Manager(configuration: configuration)
let urlReq  = ParameterEncoding.URL.encode(mutableURLRequest, parameters: request.params).0
aReq = manager.request(urlReq)
aReq!.responseJSON { (req, response, JSON, error) in }

Дополнительная информация: GitHub - проблемы с Alamofire

person San    schedule 09.02.2015

Вы можете передать объект NSMutableURLRequest непосредственно в Alamofire, поскольку он имеет расширение для NSMutableURLRequest, которое принимает URLRequestConvertible. Поэтому нет необходимости создавать свой собственный класс, чтобы просто добавить заголовок авторизации. Это так просто:

let request = NSMutableURLRequest(URL: url)
request.setValue(authorizationToken, forHTTPHeaderField:"Authorization")

Alamofire.request(request)
    .responseJSON { (_, _, JSON, error) in }
person ymerej    schedule 09.07.2015

Для Alamofire 5:

let path = BaseServiceApi().baseUrl + "login"

let params = [
    "phone": "+92322222222",
    "password" : "123123123"
    ] as [String : Any]

let request = AF.request(path, method: .post, parameters: params, encoding: JSONEncoding.default, headers: APIManager.headers(), interceptor: nil)

request.responseDecodable(of: UserModel?.self) {(resposnse) in
    
    let user = resposnse.value
    print(user)
}

Класс APIManger для заголовков:

class APIManager
{
    class func headers() -> HTTPHeaders
    {
        let headers: HTTPHeaders = [
            "Content-Type": "application/json",
            "Accept": "application/json"
        ]
        
        return headers
    }
}
person Muhammad Aakif    schedule 18.08.2020