2016-09-21 141 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