繁体   English   中英

防止NSURLSession默认HTTP标头

[英]Preventing NSURLSession default HTTP headers

我正在尝试向服务器发送非常特定的HTTP请求(即,定义HTTP标头的确切集合),但是NSURLSession保持“有帮助”地插入一堆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")设置标头request.setValue(nil, forHTTPHeaderField: "Accept-Language")但这被忽略。 尝试将其设置为"" ,但效果不好。 我也试着操纵HTTPAdditionalHeaders物业NSURLSessionConfiguration ,但没有爱。

如何获得NSURLSession不太有用?

我怀疑您要的是可能的。 NSURLSession(和NSURLConnection)会自动提供许多标头,而其中之一就是其中的一个。

也没有正当理由删除它们。 自原始HTTP / 0.9规范( https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html )以来,所有这三个标头均已成为该规范的一部分。 没有任何服务器不能正确处理或完全忽略它们,这绝对没有任何借口。

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

例如,如果需要JSON数据,则可以将Accept设置为“ application / json”或其他变体之一( 正确的JSON内容类型是什么? )。

就是说,如果您确实必须避免发送这些标头,则可以始终打开一个套接字,手动构造请求,然后发送它。 假设服务器不需要分块编码,这很容易做到。 (但是,块编码是令人恐惧的比例,因此,如果您的服务器将其发送回去,则几乎必须诉诸于将libcurl添加到您的项目中,并使用它来发出请求。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM