Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Alamofire:401 swift中HTTP状态代码错误处理_Ios_Swift_Alamofire_Http Status Codes_Http Status Code 401 - Fatal编程技术网

Ios Alamofire:401 swift中HTTP状态代码错误处理

Ios Alamofire:401 swift中HTTP状态代码错误处理,ios,swift,alamofire,http-status-codes,http-status-code-401,Ios,Swift,Alamofire,Http Status Codes,Http Status Code 401,实际上,我需要在令牌过期时处理http状态401。我在主类DataProvider:NSObject中使用Alamofire,在ViewController中,我对每个服务使用回调函数 如何在Alamofire函数中处理response.statusCode,或者我需要在每个webService回调函数中处理response.statusCode。请告诉我最好的方法 主要用途是一旦令牌过期,它将自动导航到LoginViewController Alamofire函数:DataProvider

实际上,我需要在令牌过期时处理http状态401。我在主
类DataProvider:NSObject
中使用Alamofire,在ViewController中,我对每个服务使用回调函数

  • 如何在Alamofire函数中处理response.statusCode,或者我需要在每个webService回调函数中处理response.statusCode。请告诉我最好的方法
主要用途是一旦令牌过期,它将自动导航到
LoginViewController

Alamofire函数:
DataProvider NSObject类

@objc private func getDataFromWeb(params:NSMutableDictionary,
                                callback:@escaping (_ success:Bool, _ result:Any?)->(Bool)) -> Void {
        var method = HTTPMethod.get
        var encoding = URLEncoding.default as ParameterEncoding
        if(params["Method"] as! String == "POST"){
            method = HTTPMethod.post
            encoding = Alamofire.JSONEncoding.default
        }

        var url: String!
        if (params["ServiceName"] as! String == "Function/Login") && method.rawValue == "POST" {

            url = (params["BaseURL"]!  as! String) + (params["ServiceName"]!  as! String)

        }

        if method.rawValue == "GET" {

            url = (params["BaseURL"]!  as! String) + (params["ServiceName"]!  as! String)

        } 

        var pr = params as! Dictionary<String, Any>
        pr["BaseURL"] = nil
        pr["ServiceName"] = nil
        pr["Method"] = nil
        if token == nil{ print("token nil!") }

        Alamofire.request(url,
                          method:method,
                          parameters:pr,
                          encoding:encoding,
                          headers:[ "Accept":"application/json", "Authorization":"Bearer \(token ?? "")"])
            .downloadProgress(closure: { (progress) in
            //progress closure

                print(progress)
            print("Done progress bar working \(self.progressdelegate as Any)")
            self.progressdelegate?.progress(fractionCompleted: progress.fractionCompleted)
            })
            .validate(statusCode: 200..<300)
            .response { response in
                 print(response.error?.localizedDescription)
                if(callback(response.data?.count != 0, response.data)){
                    self.saveDataToDB(params: params, result: response.data!)
                }else{

                }

        }


    }

欢迎来到StackOverflow

更一般地处理这个问题的一种方法是在会话中添加一个。通过这种方式,您可以一次检查所有响应,并可能触发回调或本地通知以将此状态传播回UI:

class ErrorResponseMonitor: EventMonitor {
    func requestDidResume(_ request: Request) { }

    func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>) {
        if let httpResponse = response.response, httpResponse.statusCode == 401 {
            // Do stuff
        }
    }
}
class ErrorResponseMonitor:EventMonitor{
func requestDidResume(request:request){}
func请求(u请求:DataRequest,didParseResponse响应:DataResponse){
如果让httpResponse=response.response,则httpResponse.statusCode==401{
//做事
}
}
}

Alamofire的
validate
RequestInterceptor
API就是为这个用例设计的。要实现它,您需要做几件事:

  • 向您的请求添加一个
    validate
    调用。这将产生一个错误,触发Alamofire的自动重试。你已经这样做了,这很好
  • 实现一个
    RequestInterceptor
    。这包括两部分:
  • 要将令牌添加到请求中,请实现
    adapt
    功能。这可以在请求通过网络之前修改请求,并允许您在重试后将令牌添加到请求中
  • 要触发重试,请执行
    重试
    功能。在这种情况下,您需要检查出现的错误,以确定是否需要重试。如果是,您可以调用您的令牌服务来获取一个新的令牌服务并触发重试
  • 重试请求时,它将再次调整其
    URLRequest
    ,添加有效令牌,这将允许您的请求成功

  • 您可以在中阅读更多关于
    RequestInterceptor
    s的信息。

    谢谢。但是我的Alamofire函数也提供了
    .response?.statusCode
    ?如何处理这个问题?
    EventMonitor
    s更多的是作为观察者,而不是用来触发操作的东西。Alamofire有专门的API来处理这个案例。谢谢。非常详细的解释,让我详细阅读上面提到的文档。我想对你的答案投赞成票,但这需要15%的声誉,我是新手。
    class ErrorResponseMonitor: EventMonitor {
        func requestDidResume(_ request: Request) { }
    
        func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>) {
            if let httpResponse = response.response, httpResponse.statusCode == 401 {
                // Do stuff
            }
        }
    }