【问题标题】:When is a NSURLResponse not a NSHTTPURLResponse?什么时候 NSURLResponse 不是 NSHTTPURLResponse?
【发布时间】:2011-09-13 04:52:49
【问题描述】:

我见过很多代码,包括 Apple 的 SimpleURLConnections 示例,它们只是将任何 NSURLResponse 转换为 NSHTTPURLResponse。如果它总是一个 NSHTTPURLResponse 为什么 NSURLConnections 不返回 NSHTTPURLResponse?

我担心如果我只是降低响应,我会引入错误代码。

例如,不检查 isKindOfClass 是否可以这样做?

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
{
 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)redirectResponse;
 // do stuff
}

【问题讨论】:

    标签: iphone ios nsurlconnection


    【解决方案1】:

    如果您确定您的连接是通过 HTTP 协议运行的,则可以:

    NSHTTPURLResponse 对象表示对 HTTP URL 加载请求的响应。它是 NSURLResponse 的子类,提供了访问特定于 HTTP 协议响应的信息的方法。

    例如,如果您通过 FTP 连接,则将 NSURLResponse 转换为 NSHTTPURLResponse 将不正确。

    【讨论】:

    • HTTP 响应代码必须为 3 位数字,如果超过该长度,则不是有效的 HTTP 响应代码。
    • 我建议进行更好的类型检查,而不是只进行强制转换,即使我只处理 HTTP 连接,我也有很多与 NSURLResponse 不是 NSHTTPURLResponse 相关的崩溃案例。
    【解决方案2】:

    更安全的方法是自省。

    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
       NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)redirectResponse;
       // do stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多