【问题标题】:NSUrlRequest: where an app can find the default headers for HTTP request?NSUrlRequest:应用程序在哪里可以找到 HTTP 请求的默认标头?
【发布时间】:2011-08-07 10:39:29
【问题描述】:

有人知道 iOS 应用在哪里可以看到NSUrlRequest 为 HTTP 请求设置的默认标头吗?

只需使用 "http://.." NSURL 创建NSUrlRequest,然后询问:[request allHTTPHeaderFields] 返回一个空字典。但是I know 例如 "Accept-Encoding" 设置为 "gzip"。所以我想获取所有这些字段并在 HTTP 请求演示中显示它们。

我也试过swizzle[NSMutableURLRequest setValue:forHTTPHeaderField:],但似乎底层API(NSURLRequest或NSURLConnection)没有使用它来设置我正在寻找的那些默认字段。

我正在制作一个简单的 iOS 演示,它显示 HTTP 请求和响应信息,所以它是用于此的公共 API 还是私有 API 并不重要。

【问题讨论】:

    标签: cocoa ios macos core-foundation


    【解决方案1】:

    您的应用不能。这一切都在CFNetwork - Communicating with HTTP Servers 中完成。我相信它只是添加了NSURLRequest 未提供的缺失标头值。

    默认为:

    • USER-AGENT“AppName - Eng/1.0 CFNetwork/485.13.9 Darwin/10.7.0”
    • 接受“*/*”
    • 接受语言“zh-cn”
    • 接受编码“gzip,放气”
    • 连接“保持活动状态”

    【讨论】:

    • 还有HOST "host:port";
    【解决方案2】:

    嗯...也许您可能想尝试一下

    - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
    

    自定义 nsurlconnection 类中的方法。尽管文档中提到了一些关于重定向的内容,但这当然值得研究。

    【讨论】:

    • 击球不错,可惜命中率不是 100%。
    • 确实,-(NSURLRequest *)connection:willSendRequest: redirectResponse: 将在不需要重定向时调用一个简单的请求(尽管有官方文档),并且它的标头在此阶段将包含一些字段:{ Accept = "*/*"; Accept-Encoding" = "gzip, deflate"; Accept-Language" = "en-us";} 但还有更多:“主机” , "User-Agent" 和 "Connection" 设置在较低级别 - 我运行了一个简单的本地 HTTP 服务器来查看所有这些。
    【解决方案3】:

    这可能有点矫枉过正,但基于Matt Gallagher's blog post,我创建了更简单的本地 HTTP 侦听器,并向其发送了一个单独的 [mutableCopy]ed 请求,以便能够读取和输出该请求具有的所有 HTTP 标头.

    更好的解决方案必须是设置一个本地 HTTP 请求捕获器,我认为它必须看起来更好,但是对于简单演示的范围只是为了显示所有发送/接收的标头,这个解决方案是可以的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多