Programing

사용자 지정 헤더와 함께 Alamofire를 사용하는 방법

lottogame 2020. 12. 29. 06:41
반응형

사용자 지정 헤더와 함께 Alamofire를 사용하는 방법


방금 Mattt의 멋진 새 Alamofire 신속한 네트워킹 라이브러리를 살펴보기 시작했으며 사용자 지정 헤더와 함께 사용하는 방법을 잘 모르겠습니다.

AFNetworking에서 Alamofire로 변환하려는 코드는 다음과 같습니다.

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

공식 문서에 따르면 세션 구성을 수정하지 않는 것이 좋습니다.

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


요청에 따라 변경되는 헤더의 경우 요청 메소드에 직접 전달할 수 있습니다. 에서 워드 프로세서 :

요청에 사용자 지정 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 객체에서 설정하는 것이 좋습니다.


현재 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)
}

대한 참조


나는 이러한 것들을 전역 적으로 설정하는 것을 싫어하기 때문에 (때로는 그것들을 보내고, 때로는 그렇지 않다), 각 호출마다 헤더를 설정하는 래퍼 메서드를 작성했습니다.

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를 기반으로합니다.


참고 : 이것은 1.0 이전입니다. 더 이상 작동하지 않습니다 . 대신 수락 된 답변을 살펴보십시오.


Manager 싱글 톤의 defaultHeaders 속성을 사용하여 다음과 같이 헤더를 추가합니다.

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

적어도 그것은 나를 위해 작동합니다. :)


아래 코드 설정은 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 문제


You can pass an NSMutableURLRequest object directly to Alamofire, since it has an extension for NSMutableURLRequest that adopts URLRequestConvertible. So there's no need to create your own class to just add an Authorization header. It's as simple as this:

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

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

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
 }

I've created a static headers method in a separate APIManager class.

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
    }
}

And I use it in requests:

Alamofire.request(urlString,
                      method: .get,
                      headers:APIManager.headers())

   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) ")
            }
    }

ReferenceURL : https://stackoverflow.com/questions/25143938/how-to-use-alamofire-with-custom-headers

반응형