防止NSURLSession默认HTTP标头

时间:2016-09-21 22:41:56

标签: swift cocoa http-headers nsurlsession nsurl

我正在尝试为服务器制作一个非常具体的HTTP请求(即定义完全的HTTP标头集),但NSURLSession保持"有帮助& #34;插入一堆HTTP标头,例如AcceptAccept-LanguageAccept-Encoding

考虑以下操场(Swift 2.x),它向一个只发送已发送的HTTP头的服务发送请求:

import Foundation
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

let url = NSURL(string: "http://httpbin.org/headers")!
let request = NSMutableURLRequest(URL: url, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 30000)
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
let session = NSURLSession(configuration: configuration)

let task = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) in
    print(NSString(data: data!, encoding: NSUTF8StringEncoding))
    XCPlaygroundPage.currentPage.finishExecution()
}
task.resume()

您可以看到发送了三个 Accept 标头。我该如何防止这种情况?

我已尝试使用request.setValue(nil, forHTTPHeaderField: "Accept-Language")设置标头,但会被忽略。尝试将其设置为"",但没有好处。我还尝试操纵HTTPAdditionalHeaders上的NSURLSessionConfiguration属性,但没有爱。

如何让NSURLSession不那么有用?

1 个答案:

答案 0 :(得分:1)

我怀疑你所要求的是可能的。 NSURLSession(和NSURLConnection)自动提供许多标题,这就是其中之一。

也没有合理的理由将其删除。自最初的HTTP / 0.9规范(https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html)以来,所有这三个标题都是规范的一部分。对于没有正确处理或完全忽略它们的服务器,绝对没有任何借口。

话虽如此,如果您为这些字段提供了错误的值(并且默认值可能是错误的),服务器可能会拒绝为您提供结果。要解决该问题,首先要确定服务器实际提供的数据类型,并在Accept标头中指定该值而不是默认值。

例如,如果您期望JSON数据,可以将Accept设置为“application / json”或其他变体之一(What is the correct JSON content type?)。

也就是说,如果确实必须避免发送这些标头,您可以随时打开套接字,手动构建请求并发送它。假设服务器不需要分块编码,那么很容易做到。 (然而,分块编码是一个惊人的比例,所以如果你的服务器发送回来,你几乎不得不求助于将libcurl添加到你的项目中并使用它来发出请求。)