web-dev-qa-db-ja.com

カスタムヘッダーでAlamofireを使用する方法

Matttのすばらしい新しいAlamofire Swiftネットワークライブラリを調べ始めたばかりで、カスタムヘッダーでどのように使用するかはよくわかりません。

AFNetworkingからAlamofireに変換しようとしているコードは次のとおりです。

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

公式文書によると、セッション構成の変更は推奨されていません。

これは、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の回答は機能しなくなりました。新しいバージョンでは、HTTPAdditionalHeadersNSURLSessionConfigurationプロパティに追加のヘッダーを追加する必要があります

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

詳細はこちら: https://github.com/Alamofire/Alamofire/issues/111

48
Nikola Lajic

リクエストごとに変わるヘッダーの場合、リクエストメソッドに直接渡すことができます。 ドキュメント から:

リクエストへのカスタム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オブジェクトで設定することをお勧めします。

35
kcstricks

現時点では、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)
}

参照 の場合

28
Nhat Dinh

私はこれらの設定をグローバルに設定することを嫌っています(そして時々送信しますが、送信しないこともあります)ので、呼び出しごとにヘッダーを設定するラッパーメソッドを作成しました。

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に基づいています。

5
Travis

NOTE:これは1.0より前でした。 動作しなくなりました、代わりに受け入れられた答えを見てください。


次のように、ManagerシングルトンのdefaultHeadersプロパティを使用してヘッダーを追加します。

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

少なくとも私にとってはうまくいきます。 :)

5
Per Ejeklint

以下のコードの設定は、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 Issues

3
San

別の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())
3
wzbozon

NSMutableURLRequestを採用するNSMutableURLRequestの拡張機能があるため、URLRequestConvertibleオブジェクトをAlamofireに直接渡すことができます。したがって、Authorizationヘッダーを追加するだけの独自のクラスを作成する必要はありません。次のように簡単です。

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

Alamofire.request(request)
    .responseJSON { (_, _, JSON, error) in }
3
ymerej

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
 }
3
Pankaj Nigam
   let aManager = Manager.sharedInstance
    aManager.session.configuration.HTTPAdditionalHeaders = [
        "Authorization": "Some authentication Token here" ]


    let URL =  "some url string"

    request(.GET, URL, encoding: .JSON)
        .responseJSON {
            (request, response, data, error) -> Void in

            if(error != nil)
            {
                if let delegate = self.delegate {
                    delegate.connectionDidFinishedErrorResponceForAction!(1, andWithResponse: nil)
                }
                println("\(error!.localizedDescription)")

            }
            else {

                if let delegate = self.delegate {
                    delegate.connectionDidFinishedForAction!(1, andWithResponse: nil)
                }
               println("req:\(request) \n res:\(response) \n json:\(data!) \n \(error) ")
            }
    }
2
Saumil Shah