Alamofire 5中未设置授权标头?

Posted

技术标签:

【中文标题】Alamofire 5中未设置授权标头?【英文标题】:Authorization Header not setting in Alamofire 5? 【发布时间】:2021-07-02 11:53:44 【问题描述】:

我将基本身份验证令牌设置为我的 URLRequest 并使用 Alamofire 执行。

我设置了 3 个标头,内容、接受和身份验证...内容和接受在网络流量中可见,但身份验证不可见。如果我在发送之前打印 URLRequest 的标头,则它是可用的...

这里有什么想法吗?因为我没有看到它是如何在发布之前删除 auth 标头的

代码如下:

        // Construct url
        let url = try APIConstants.baseUrl.asURL()

        // Append path
        var urlRequest = URLRequest(url: url.appendingPathComponent(path))

        // Determine HTTP method
        urlRequest.httpMethod = method.rawValue

        let headers: HTTPHeaders = [
            .contentType(APIConstants.ContentType.json.rawValue),
            .accept(APIConstants.ContentType.json.rawValue),
        ]

        if let token = token 
            urlRequest.addValue("\(APIConstants.API.token.rawValue) \(token.key)",
                                forHTTPHeaderField: "Authorization")
        

        urlRequest.headers = headers

        // Add http body to request
        if let parameters = parameters 
            do 
                let data = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
                urlRequest.httpBody = data
             catch (_) 
                print("APIRouter: Failed to parse body into request.")
            
        

        //Encoding
        let encoding: ParameterEncoding = 
            switch method 
            case .get:
                return URLEncoding.default
            default:
                return JSONEncoding.default
            
        ()

        return try encoding.encode(urlRequest, with: parameters)

    

在我的休息客户端中,我执行如下:

        return Observable<T>.create  observer in
            let request = AF.request(urlConvertible).responseDecodable  (response: DataResponse<T, AFError>) in
                switch response.result 
                case .success(let value):
                    observer.onNext(value)
                    observer.onCompleted()
                case .failure(let error):
                    switch response.response?.statusCode 
                    case 403:
                        observer.onError(APIError.forbidden)
                    case 404:
                        observer.onError(APIError.notFound)
                    case 409:
                        observer.onError(APIError.conflict)
                    case 500:
                        observer.onError(APIError.internalServerError)
                    default:
                        observer.onError(error)
                    
                
            

            return Disposables.create 
                request.cancel()
            
        
    

编辑:

更新 func 以显示更多问题:

    func asURLRequest() throws -> URLRequest 
        // Construct url
        let url = try APIConstants.baseUrl.asURL()

        // Append path
        var urlRequest = URLRequest(url: url.appendingPathComponent(path))

        // Determine HTTP method
        urlRequest.httpMethod = method.rawValue

        let headers: HTTPHeaders = [
            .contentType(APIConstants.ContentType.json.rawValue),
            .accept(APIConstants.ContentType.json.rawValue),
            .authorization("Token a5555485aa251b28fdsfasdfdsb379c131fddad")
        ]

        urlRequest.headers = headers

        // Add http body to request
        if let parameters = parameters 
            do 
                let data = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
                urlRequest.httpBody = data
             catch (_) 
                print("APIRouter: Failed to parse body into request.")
            
        

        //Encoding
        let encoding: ParameterEncoding = 
            switch method 
            case .get:
                return URLEncoding.default
            default:
                return JSONEncoding.default
            
        ()

        return try encoding.encode(urlRequest, with: parameters)

    

【问题讨论】:

【参考方案1】:

URLRequest 中设置 Authorization 标头后:

urlRequest.addValue("\(APIConstants.API.token.rawValue) \(token.key)", forHTTPHeaderField: "Authorization")

然后通过设置headers 属性覆盖所有请求的标头:

urlRequest.headers = headers

一个不错的解决方案是更新您在上面已经创建的headers,如下所示:

var headers: HTTPHeaders = [
    .contentType(APIConstants.ContentType.json.rawValue),
    .accept(APIConstants.ContentType.json.rawValue),
]

if let token = token 
    headers.add(.authorization("\(APIConstants.API.token.rawValue) \(token.key)"))


urlRequest.headers = headers

【讨论】:

我更新了问题中的代码以更好地说明问题,我使用示例令牌将 auth 标头硬编码到数组中,它仍然存在于网络监视器中 这是一个问题,另一个是我错过了一个尾随 / 似乎删除了 auth 标题..go figure【参考方案2】:

另一种解决方案是使用 KeyValue 对,如下所示:

var header: HTTPHeaders = [:]
        
if let token = getValueFromUserDefaults(keyName: "authToken") as? String 
                
    header["Authorization"] = token
                

            

我总是使用这种方法。这对我来说更方便。

【讨论】:

以上是关于Alamofire 5中未设置授权标头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不建议在 Alamofire 中修改授权标头的会话配置?

为啥 Alamofire 中 Http Headers 中的“授权”字段会自动设置?

在 post 方法中发送标头

Alamofire 不发送当前标头(swift)

在 swift 3 中下载文件时,alamo fire 中的进度视图不会更新

iOS/IBM Cloud/Swift:使用 AlamoFire 发布到 Watson API