我正在使用Alamofire的应用程序中实现授权。我有一个授权令牌,可以添加到我提出的每个HTTP
请求的标头中,然后检查其响应以查看服务器是否返回了401
状态码?然后,注销用户。
最佳做法是什么?有没有一种简单的方法可以将此行为添加到每个请求中?
我期望的目标是在我的代码中检查401 error code
的真相。
我没有找到令人满意的答案,有关如何执行此操作的任何建议?
答案 0 :(得分:1)
Alamofire
提供了两个protocol
和RequestAdapter
。
RequestRetrier
。这是注入令牌的理想场所。
RequestAdapter
。您可以检查故障原因并检测到401未经授权的情况,然后向系统发送全局通知(可能在RequestRetrier
中进行管理)
您必须将它们分配给当前的AppDelegate
管理请求。
您还可以阅读how to implement simple OAuth的Alamofire文档。
答案 1 :(得分:0)
您发送请求的主要方法如下
func sendJsonRequest(
accessPoint: String,
method: HTTPMethod,
parameters: Parameters,
headers: HTTPHeaders,
encoding: ParameterEncoding = JSONEncoding.default,
success: @escaping (_ response: DataResponse<Any>, _ json: NSDictionary) -> Void,
failure: @escaping (_ response: DataResponse<Any>, _ error: Error) -> Void
) -> DataRequest {
return Alamofire.request(
accessPoint,
method: method,
parameters: parameters,
encoding: encoding,
headers: headers
).validate().responseJSON(queue: getQueue()) { response in
switch response.result {
case .success (let data):
success(response, data)
case .failure(let error):
if response.response?.statusCode == 401 {
// Do what you want to do here
} else {
failure(response, error)
}
}
}
}
以及其他诸如get,post之类的方法都可以在内部调用它
func post(
accessPoint: String,
parameters: Parameters,
headers: HTTPHeaders,
success: @escaping (_ response: DataResponse<Any>, _ json: NSDictionary) -> Void,
failure: @escaping (_ response: DataResponse<Any>, _ error: Error) -> Void
) -> DataRequest {
return sendJsonRequest(
accessPoint: accessPoint,
method: .post,
parameters: parameters,
headers: headers,
success: success,
failure: failure
)
}
func get(
accessPoint: String,
headers: HTTPHeaders,
success: @escaping (_ response: DataResponse<Any>, _ json: NSDictionary) -> Void,
failure: @escaping (_ response: DataResponse<Any>, _ error: Error) -> Void
) -> DataRequest {
return jsonRequest(
accessPoint: accessPoint,
method: .get,
parameters: [:],
headers: headers,
encoding: URLEncoding.default,
success: success,
failure: failure
)
}
这可以在您的BaseService
中,其他服务可以扩展它。
答案 2 :(得分:0)
我想您想问的是如何验证用户的cookie是否可用。 我这样处理:
使用 HTTPCookieStorage 存储用户的cookie(包含令牌,过期时间,值和其他)
IN登录
Alamofire.request(url, method: .post, parameters: para, encoding: URLEncoding.default,headers: headers).response { (response) in
guard response.response?.statusCode == 200 else{
// error handling
return
}
let headerFields = response.response?.allHeaderFields as? [String: String]
let Url = response.request?.url
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields!, for: Url!)
HTTPCookieStorage.shared.setCookies(cookies, for: Url!, mainDocumentURL:nil)
}
HTTPCookieStorage将自动删除过期的Cookie, 我的应用程序,最多只能有一个Cookie,所以我使用
if HTTPCookieStorage.shared.cookies == [] {
//error
}
检查令牌是否无效,或者您可以使用 NSHTTPCookieManagerCookiesChanged 通知来观察cookie的更改。