2016-07-21 49 views
1

隨着我正在使用的服務,大多數響應都是使用XML,但其中一些是純文本。什麼是最好的方式來設置?響應變換例外

目前我有這樣的:

// Root should return plain text, don't try to transform it 
configureTransformer("/") { (content: String, entity) -> String? in 
    return content 
} 
// Most data is XML 
configureTransformer("**") { (content: NSData, entity) -> NSXMLDocument? in 
    return try? NSXMLDocument(data: content, options: 0) 
} 
configureTransformer("**/properties/*") { 
    (content: NSData, entity) -> String? in 
    return String(data: content, encoding: NSUTF8StringEncoding) 
} 

..但是,當我查詢根URL,這將是純文本,我得到一個錯誤,因爲NSData的 - >不能適用NSXMLDocument變壓器。

編輯:也許我真正想要的是應用XML轉換器時,內容類型是application/xml。有沒有辦法做到這一點?

+1

這不工作的原因是貝塔8的,後來'configureTransformer'電話取代早期的默認情況下,所以第一個字符串→字符串變換器甚至不會被應用。如果你爲'**/properties/*'配置了String→String塊,它將覆蓋'**'。但正如你的答案所指出的那樣,'Content-type'是更好的方法。 –

回答

1

基於我在Service.init()看,我這樣做,它的工作相當不錯:

func XMLResponseTransformer(
    transformErrors: Bool = true) -> Siesta.ResponseTransformer 
{ 
    return Siesta.ResponseContentTransformer(transformErrors: transformErrors) { 
    (content: NSData, entity: Siesta.Entity) throws -> NSXMLDocument in 
    return try NSXMLDocument(data: content, options: 0) 
    } 
} 

configure(description: "xml") { 
    $0.config.pipeline[.parsing].add(XMLResponseTransformer(), 
            contentTypes: [ "*/xml" ]) 
} 
+1

這是堅實的。如果您的服務器發送正確的信息,使用「Content-type」標頭是最好的方式:不要混淆正確的路徑。 –

+0

感謝您的確認! – Uncommon