사용자 지정 헤더와 함께 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 |