我正在尝试向服务器发送一个非常具体的 HTTP 请求(即定义exactHTTP 标头集),但是NSURLSession
不断“有帮助地”插入一堆 HTTP 标头,例如Accept
, Accept-Language
and Accept-Encoding
.
考虑以下 Playground (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
不那么有帮助吗?
我怀疑你所要求的是否可能。 NSURLSession(和 NSURLConnection)自动提供许多标头,这就是其中之一。
也没有正当理由删除它们。自原始 HTTP/0.9 规范以来,所有这三个标头都已成为规范的一部分(https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html)。任何服务器绝对没有理由不正确处理这些问题或完全忽略它们。
话虽如此,如果您为这些字段提供了错误的值(默认值可能是错误的),服务器可能会拒绝为您提供结果。要解决这个问题,首先要弄清楚服务器实际上要提供什么类型的数据,然后在 Accept 标头中指定该值而不是默认值。
例如,您可以将 Accept 设置为“application/json”或其他变体之一(正确的 JSON 内容类型是什么?) 如果您需要 JSON 数据。
也就是说,如果你really必须避免发送这些标头,您始终可以打开套接字,手动构造请求,然后发送它。假设服务器不需要分块编码,这很容易做到。 (然而,分块编码是一个巨大的恐怖,所以如果你的服务器将其发回,你几乎不得不求助于将 libcurl 添加到你的项目中并使用它来发出请求。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)