使用NSURLSession处理HTTP错误的最佳实践?

时间:2016-11-02 08:20:50

标签: ios nsurlconnection nsurlsession nsurlsessiondownloadtask

来自apple's doc - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error只会通过错误参数报告客户端错误。

  

注意:NSURLSession不会通过error参数报告服务器错误。您的应用通过error参数接收的唯一错误是客户端错误,例如无法解析主机名或连接到主机。 URL加载系统错误代码中描述了错误代码。   通过NSHTTPURLResponse对象中的HTTP状态代码报告服务器端错误。

但是当我在iOS9中使用NSURLSessionDataTask进行测试时,似乎苹果将一些HTTP错误映射到NSURLError。例如,404 to NSURLErrorFileDoesNotExist。这个事实打破了我们以前的假设,many snippet also take the error parameter as connection error,这绝对是错误的。

我尝试搜索并发现Apple可能只在NSURLSessionDownloadTask中提及此更改。并没有详细记录如何应用这些地图。

  

与NSURLSessionDataTask或NSURLSessionUploadTask不同,NSURLSessionDownloadTask将通过HTTP状态代码报告的服务器端错误报告给相应的NSError对象。

我个人认为Apple的Dev团队犯了一个大错误;并且文件仍然不一致而且不是真的,即使两年过去也没有任何更新。

有人提供有关此更改的更多信息吗? 现在区分连接错误和HTTP错误的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

答案与以往一样。如果您的服务器发送带有200错误代码的错误(例如,在JSON响应中),则您必须自己处理该检查。否则:

  • 如果您关心服务器发送的具体HTTP状态代码,请实施didReceiveResponse委托方法并拦截错误。
  • 如果您只关心请求失败并且您不关心原因,那么您可以通过完成回调中的错误参数保证某些错误,但您不是#39;保证会收到任何特定错误。

请注意,成功定义为以下任何一项:

  • 结果代码200(确定)
  • 结果代码304(未修改)
  • 重定向到返回200或304
  • 的网页

如果您的定义不同(例如,如果您的服务器通过重定向到错误页面来响应无效的URL),则需要添加委托方法来检测重定向并将其视为错误。