防止斯威夫特与Alamofire重定向响应

问题描述 投票:2回答:4

我在寻找示例代码如何防止重定向响应(状态代码为3xx)时请求Web API。我使用的是斯威夫特与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)
        })

但它不工作,看起来像变成无限循环。我对查尔斯测试。

swift redirect alamofire
4个回答
5
投票

使用AlamoFire 2.4(Xcode7)替代(代码片段)的溶液。就我而言,我总是希望重定向。 (我拆包缩短的链接。)如果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/}

提取的URL:https://www.google.com/


2
投票

它看起来好像回到nil都不可能导致死锁。相反,尝试创建具有相同的原始URL新NSURLRequest。见@ jhersh在以前Alamofire PR notes在他tests的意见和实施一起。

How to Stop a Redirect

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()

你不能通过nilNSURLSessionTaskDelegate方法的completionHandler事实看起来像一个错误。我要文件中查找该雷达,我会发布一个链接错误报告一次我完了。


1
投票

在斯威夫特4,

let delegate = Alamofire.SessionManager.default.delegate

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

0
投票

我不知道,如果你Alamofire的版本有公众代表支持。我最后一次检查委托是私人的。我使用@jhersh所做的更改。您可以检查他补充和如何跟随着GitHub的PR使用委托。 https://github.com/Alamofire/Alamofire/issues/314

© www.soinside.com 2019 - 2024. All rights reserved.