防止 NSURLSession 默认 HTTP headers
Preventing NSURLSession default HTTP headers
我正在尝试为服务器制作一个非常具体的 HTTP 请求(即定义 exact 组 HTTP headers),但是 NSURLSession
使 "helpfully" 插入一堆 HTTP header,例如 Accept
、Accept-Language
和 Accept-Encoding
。
考虑以下 playground (Swift 2.x),它向服务发送请求,该服务仅回显已发送的 HTTP headers:
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 header。我怎样才能防止这种情况发生?
我试过使用 request.setValue(nil, forHTTPHeaderField: "Accept-Language")
设置 header 但它被忽略了。尝试将其设置为 ""
,但效果不佳。我也试过在 NSURLSessionConfiguration
上操纵 HTTPAdditionalHeaders
属性,但没有爱。
如何让 NSURLSession
变得不那么有帮助?
我怀疑你要求的是可能的。 NSURLSession(和 NSURLConnection)自动提供了一些 headers,这就是其中之一。
也没有正当理由删除它们。自最初的 HTTP/0.9 规范 (https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html) 以来,所有这三个 header 都是规范的一部分。任何服务器都没有理由不正确处理或完全忽略它们。
话虽如此,如果您为这些字段提供了错误的值(并且默认值可能是错误的),服务器可能会拒绝为您提供结果。要解决该问题,首先要弄清楚服务器实际要提供的数据类型,并在 Accept header 中指定该值而不是默认值。
例如,如果您需要 JSON 数据,您可以将接受设置为 "application/json" 或其他变体之一 (What is the correct JSON content type?)。
也就是说,如果您确实必须避免发送那些header,您始终可以打开一个套接字,手动构建请求,然后发送它。假设服务器不需要分块编码,这很容易做到。 (然而,分块编码是一种巨大的恐怖,所以如果您的服务器将其发回,您将不得不求助于将 libcurl 添加到您的项目中并使用它来发出请求。)
我正在尝试为服务器制作一个非常具体的 HTTP 请求(即定义 exact 组 HTTP headers),但是 NSURLSession
使 "helpfully" 插入一堆 HTTP header,例如 Accept
、Accept-Language
和 Accept-Encoding
。
考虑以下 playground (Swift 2.x),它向服务发送请求,该服务仅回显已发送的 HTTP headers:
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 header。我怎样才能防止这种情况发生?
我试过使用 request.setValue(nil, forHTTPHeaderField: "Accept-Language")
设置 header 但它被忽略了。尝试将其设置为 ""
,但效果不佳。我也试过在 NSURLSessionConfiguration
上操纵 HTTPAdditionalHeaders
属性,但没有爱。
如何让 NSURLSession
变得不那么有帮助?
我怀疑你要求的是可能的。 NSURLSession(和 NSURLConnection)自动提供了一些 headers,这就是其中之一。
也没有正当理由删除它们。自最初的 HTTP/0.9 规范 (https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html) 以来,所有这三个 header 都是规范的一部分。任何服务器都没有理由不正确处理或完全忽略它们。
话虽如此,如果您为这些字段提供了错误的值(并且默认值可能是错误的),服务器可能会拒绝为您提供结果。要解决该问题,首先要弄清楚服务器实际要提供的数据类型,并在 Accept header 中指定该值而不是默认值。
例如,如果您需要 JSON 数据,您可以将接受设置为 "application/json" 或其他变体之一 (What is the correct JSON content type?)。
也就是说,如果您确实必须避免发送那些header,您始终可以打开一个套接字,手动构建请求,然后发送它。假设服务器不需要分块编码,这很容易做到。 (然而,分块编码是一种巨大的恐怖,所以如果您的服务器将其发回,您将不得不求助于将 libcurl 添加到您的项目中并使用它来发出请求。)