【问题标题】:Alamofire validate headers before receiving all data (Full body)Alamofire 在接收所有数据之前验证标头(全文)
【发布时间】:2018-03-15 22:55:52
【问题描述】:

使用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. 
                }
    }

【问题讨论】:

  • 你只能使用两个请求来实现你想要的。响应标头是响应本身的一部分,那么如何在获取响应之前检查标头?
  • 嗨,大卫。我看到我的标题不正确。我想验证响应标头,然后决定是否要下载完整的响应正文。
  • 是否应该可以在收到标头时中止请求?喜欢stackoverflow.com/questions/17390319/…
  • 它是相关的,因为它使用了相同的技术。 iOS 正在执行 HTTP 请求(就像 PHP CURL 一样),我希望 alamofire 停止根据标头中的数据获取数据。
  • 这正是我想要的,但是当标头包含一些信息时,我想用完整的主体“继续”流而不丢失连接/让服务器再次计算主体。

标签: ios swift request http-headers alamofire


【解决方案1】:

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

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

为了简化:

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

编辑:

虽然有更好的解决方案... 可以使用URLSessionDataDelegateurlSession(_:dataTask:didReceive:completionHandler:)方法。

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

编辑 2:

还有另一种使用 HTTP/2 服务器推送协议的解决方案,尽管它目前还几乎是未知领域,因为它还没有以这种方式应用。

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

进一步阅读:

【讨论】:

  • 这是我们的备份计划,但我不喜欢这种方式,因为可以缓存多个响应。例如,请求 server-url.com/request/example/request 可以有 100 个不同的响应。使用您的解决方案,我需要在请求中发送 100 个哈希值。
  • 是的,似乎不对。我已经用替代解决方案编辑了答案。认为它应该非常适合您的要求。
  • 您的编辑完全是我想要的。我已经更新了我的初始帖子。
猜你喜欢
  • 2016-03-18
  • 2016-09-03
  • 1970-01-01
  • 2016-03-03
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多