62

Mattt のすばらしい新しい Alamofire swift ネットワーキング ライブラリを調べ始めたところですが、カスタム ヘッダーでそれをどのように使用するのかよくわかりません。

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

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

11 に答える 11

51

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

これは、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

于 2014-09-26T08:53:18.920 に答える
40

リクエストごとに変化するヘッダーについては、リクエスト メソッドに直接渡すことができます。ドキュメントから:

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

于 2016-03-30T04:56:43.210 に答える
5

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

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

于 2015-07-13T21:30:15.360 に答える
5

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

When Headers cause problem while sending it in the request, then we need to encode parameter, for this we do JSONEncoding.prettyPrinted or JSONEncoding.default like :

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
 }
于 2017-12-06T10:42:10.223 に答える