2016-07-21 45 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