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 中的“授权”字段会自动设置?