2016-09-21 69 views
0

我想制作一个非常特殊的HTTP请求到服务器(即定义确切的HTTP头),但NSURLSession保持“有益”将像Accept一堆的HTTP标头,Accept-LanguageAccept-Encoding防止NSURLSession默认HTTP标头

考虑下面的操场(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() 

你可以看到有三个接受头是发送。我怎样才能防止呢?

我试过使用request.setValue(nil, forHTTPHeaderField: "Accept-Language")设置标题,但被忽略。尝试将其设置为"",但没有好处。我也尝试在NSURLSessionConfiguration上操纵HTTPAdditionalHeaders属性,但没有爱。我如何得到NSURLSession不太有用?

回答

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添加到你的项目中,并用它来提出请求。)

+0

感谢您的支持想法。我的情况有点特别,因为我的应用(serveupapp.com)是一个接受来自远程源(可能是正在开发的移动应用)的传入请求并返回模拟响应或将其转发给真实服务器的应用。我真的很想忠实地转发我收到的确切的标题集......正如你所说,几乎可以确定我会真正收到这些标题,但是我只是想考虑我将如何处理这种情况“T。 –

+0

看着Swift开源代码(https://github.com/apple/swift-corelibs-foundation/blob/db54d310bf348de6834d1ec9f83721d403100ccf/Foundation/NSURLSession/NSURLSessionTask.swift#L594),它看起来像所有东西都被委托给libcurl。不幸的是,'NSURLSession'及其朋友的结构似乎使得重写这些方法有点棘手,而没有一系列可能在版本之间变化的脆弱魔法。我可能只需要忍受它。 –

+0

你在那看到的并不是实际的Foundation网络源代码。这完全是Apple提供的兼容性层,因此NSURLSession的最关键部分可用于非Mac平台。结果,很多东西完全没有了,例如后台会话。真正的NSURLSession实现是用Objective-C编写的,而IIRC是CFNetwork之上的一个非常薄的层,它是用C/C++编写的。当然,除非你在Linux或其他操作系统上使用这个API,也就是说。 – dgatwood