Alamofire在接收所有数据之前验证标头(全身)

时间:2017-10-04 13:53:03

标签: ios swift request http-headers alamofire

使用Alamofire,在下载完整文件之前是否可以使用函数来处理标题响应?

例如:

我们的应用在多个页面上使用相同的元素。使用请求收集这些元素。每个请求都有自己的哈希值(md5校验和)。我们在标题&中发送此哈希值如果在缓存系统中识别出哈希,我想中止请求。

示例实施

APIManager.sharedManager.request(url, method: method, parameters: parameters)

            .doSomethingHere {
             //I want to read the headers here, before the data is fetched from the server.
             //There needs to be an option here to cancel the request.
            }

            .responseJSON { response in
             //If the request isn't cancel in the function above. The data should be here.
            }
}

编辑:解决方案(Alamofire实施SWIFT 3)

APIManager.sharedManager.delegate.dataTaskDidReceiveResponse =
        {(session:URLSession, dataTask:URLSessionDataTask, response:URLResponse) -> URLSession.ResponseDisposition in

            if let httpResponse = response as? HTTPURLResponse {
                //Do something with headers here. If you don't want to continue the request:
                return URLSession.ResponseDisposition.cancel

            }       

            return URLSession.ResponseDisposition.allow
    }

APIManager.sharedManager.request(url, method: method, parameters: parameters)
                .responseJSON { response in
                 //Response contains no data if it was canceled. 
                }
    }

1 个答案:

答案 0 :(得分:2)

标题实际上是响应的一部分,因此您可能需要发出两个请求才能执行此操作。

我从评论中得知,这是你想要避免的。 在这种情况下,您可以做的是在请求本身中发送哈希。然后服务器决定是否返回数据。

简化:

  1. 在请求中发送哈希值。
  2. 服务器检查哈希是否存在
  3. 如果有空响应(或某些状态代码),如果没有,则回复数据。
  4. 编辑:

    虽然有更好的解决方案...... 您可以使用urlSession(_:dataTask:didReceive:completionHandler:)的{​​{1}}方法。

    您可以检查标头中返回的哈希值。然后在此方法的完成处理程序中传递一个常量,指示是继续执行任务还是取消它。更多关于here

    编辑2:

    还有另一种使用HTTP / 2服务器推送协议的解决方案,虽然它现在已经非常未知,但它还没有以这种方式应用。

    通过服务器推送,服务器发送"推送承诺"以及第一个回应。这些承诺是小框架,通知客户端服务器将发送的后续响应。 因此,在这种情况下,您可以将散列作为第一个响应和实际数据的推送承诺返回。

    进一步阅读: