【问题标题】:Prevent redirect response with Alamofire in Swift在 Swift 中使用 Alamofire 防止重定向响应
【发布时间】:2015-04-24 11:00:45
【问题描述】:

我正在寻找如何在请求 web api 时防止重定向响应(状态代码 3xx)的示例代码。我正在使用 Swift 和 Alamofire 1.2。 我试过了:

delegate.taskWillPerformHTTPRedirection = { (session: NSURLSession!, task: NSURLSessionTask!, response: NSHTTPURLResponse!, request: NSURLRequest!) in
            return nil
        }

但不工作

我也尝试过:https://github.com/Alamofire/Alamofire/pull/350/files 并将我自己的代码更改为:

    var acc = self.txtAccount.text
    var pwd = self.txtPassword.text
    var url : String = "http://10.1.0.2:8081/wordpress/wp-json/users/me"
    let delegate = Alamofire.Manager.sharedInstance.delegate
    delegate.taskWillPerformHTTPRedirection = { (session: NSURLSession!, task: NSURLSessionTask!, response: NSHTTPURLResponse!, request: NSURLRequest!) in

        var request = NSMutableURLRequest(URL: NSURL(string: url)!)
        request.HTTPMethod = "GET"

        var credential = "\(acc):\(pwd)"
        var authData = credential.dataUsingEncoding(NSUTF8StringEncoding)
        var encodedAuthData = authData?.base64EncodedStringWithOptions(nil)
        var authValue = "Basic \(encodedAuthData!)"

        request.setValue(authValue, forHTTPHeaderField: "Authorization")
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")
        return request
    }

    //I've implemented URLRequestConvertible 'Router'. it also have call the same above url
    Alamofire.request(Router.Authorize(acc, pwd))
        .response({(request, response, data, error) in
            println(request)
        })

但它不起作用,似乎变成了无限循环。我在查尔斯身上测试过。

【问题讨论】:

  • 如果你把println("Redirection is calling my closure")放在那个闭包里,你看到它被调用了吗?还是下断点?
  • delegate 如果你没有设置它可以为 nil

标签: swift redirect alamofire


【解决方案1】:

使用 AlamoFire 2.4 (Xcode7) 的替代(代码 sn-p)解决方案。就我而言,我总是期待重定向。 (我正在解压缩一个缩短的链接。)如果 request.response 调用中的完成运行,那对我来说是一个错误。

func printRedirectUrl() {

    // taskWillPerformHTTPRedirectionWithCompletion: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest, NSURLRequest? -> Void) -> Void)?
    Alamofire.Manager.sharedInstance.delegate.taskWillPerformHTTPRedirectionWithCompletion = { session, task, response, request, completion in
        // request.URL has the redirected URL inside of it, no need to parse the body
        print("REDIRECT Request: \(request)")
        if let url = request.URL {
            print("Extracted URL: \(url)")
        }
        Alamofire.Manager.sharedInstance.delegate.taskWillPerformHTTPRedirection = nil // Restore redirect abilities
        return
    }

    // We expect a redirect, so the completion of this call should never execute
    let url = NSURL(string: "https://google.com")
    let request = Alamofire.request(.GET, url!)
    request.response { request, response, data, error in
        print("Logic Error, response should NOT have been called for request: \(request)")
        Alamofire.Manager.sharedInstance.delegate.taskWillPerformHTTPRedirection = nil // Restore redirect abilities - just in case
    }
}

重定向请求:{ URL:https://www.google.com/}

提取的网址:https://www.google.com/

【讨论】:

    【解决方案2】:

    在 Swift 4 中,

    let delegate = Alamofire.SessionManager.default.delegate
    
            delegate.taskWillPerformHTTPRedirection = { (session, task, response, request) -> URLRequest? in
               // print("REDIRECT Request: \(request)")
                return nil
            }
    

    【讨论】:

    • 工作就像一个魅力!谢谢,朋友!
    【解决方案3】:

    看起来返回nil 可能会导致死锁。相反,请尝试使用相同的原始 URL 创建一个新的NSURLRequest。请参阅之前的 Alamofire PR 中的 @jhersh 的 notes 以及他的 tests 中的 cmets 和实现。

    如何停止重定向

    func disallowRedirect() {
        let URL = "http://google.com/"
        let delegate = Alamofire.Manager.sharedInstance.delegate
    
        delegate.taskWillPerformHTTPRedirection = { session, task, response, request in
            return NSURLRequest(URL: NSURL(string: URL)!)
        }
    
        let request = Alamofire.request(.GET, URL)
        request.response { request, response, data, error in
            println("Request: \(request)")
            println("Response: \(response)")
            println("Data: \(NSString(data: data as! NSData, encoding: NSUTF8StringEncoding))")
            println("Error: \(error)")
        }
    }
    
    disallowRedirect()
    

    您不能将nil 传递给NSURLSessionTaskDelegate 方法的completionHandler 的事实看起来像一个错误。我将为此提交一份雷达文件,完成后我将发布错误报告的链接。

    【讨论】:

    • 所以解决方案是我在 taskWillPerformHTTPRedirection 中创建一个虚拟 NSURLRequest?以及如何在 taskWillPerformHTTPRedirection 中获取响应数据。因为我只在 Request 类的响应处理程序中获取重定向请求的响应数据
    • 您不想在taskWillPerformHTTPRedirection 中获取响应数据。您想在响应序列化程序中获取它。如果您正确禁用重定向,您应该会收到来自原始请求的响应。请参阅此article 了解更多信息。
    • 首先,我想禁用重定向并在response方法中接收响应数据。在您上面的评论提到返回 nil 导致死锁之后,@jhersh 的测试也有评论 + // TODO: URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler: + // suggests that returning nil should refuse the redirect, but this causes a deadlock/timeout + 所以我正在寻找如何在 taskWillPerformHTTPRedirection 中访问原始请求的数据。现在你建议我禁用重定向。我想知道我该怎么做?
    • 亲爱的朋友,代码好像变成了无限循环。我更清楚地更新了我的问题。我无法在 PG 上测试,因为不知道如何在 PG 上导入 alamofire
    • 当我在 alamorefire 操场上测试并使用示例 url: google.com 时,结果是消息 Optional(Error Domain=NSURLErrorDomain Code=-1007 "too many HTTP redirects" 。请求循环了大约 16 次并停了下来。
    【解决方案4】:

    你好其实很简单

    Alamofire 有一个重定向器,可以

    例子

    let request = AF.request("https://google.com",method: .post,parameters: parameters)
    .cURLDescription { description in
                debugPrint(description)
            }
            let redirector = Redirector(behavior: .doNotFollow)
            request.redirect(using: redirector)
    
    

    它不会重定向

    它也在高级用法部分的文档中

    【讨论】:

      【解决方案5】:

      我不知道您的 Alamofire 版本是否支持公共委托。上次我检查委托是私人的。我正在使用@jhersh 所做的更改。您可以通过以下 github pr 查看他的添加以及如何使用委托。 https://github.com/Alamofire/Alamofire/issues/314

      【讨论】:

      • 代理及其各种覆盖闭包在 Alamofire 1.2.0 版本中正式开放。
      • 感谢您的信息。由于我使用的是 iOS 7,我无法直接使用该版本,我使用我自己的版本和 struct 等来模仿框架。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      相关资源
      最近更新 更多