사용자 지정 헤더와 함께 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
'Programing' 카테고리의 다른 글
데이터 디렉토리 gitlab을 변경하여 다른 곳에 저장소를 저장하십시오. (0) | 2020.12.29 |
---|---|
장고 : 고정 태그를 블록 태그에 넣는 것이 불가능합니까? (0) | 2020.12.29 |
emacs를 다시 시작하지 않고 편집 한 후 .spacemacs 파일을 어떻게 다시로드 할 수 있습니까? (0) | 2020.12.29 |
Kotlin에서 @Autowired와 같은 스프링 주석을 사용하는 방법은 무엇입니까? (0) | 2020.12.29 |
오류 메시지“응용 프로그램을 설치하거나 실행할 수 없습니다. (0) | 2020.12.29 |