如何使用 Alamofire.request() 将 XML 肥皂响应保存到文件?

Posted

技术标签:

【中文标题】如何使用 Alamofire.request() 将 XML 肥皂响应保存到文件?【英文标题】:How can I save an XML soap response to file using Alamofire.request()? 【发布时间】:2019-08-20 02:06:52 【问题描述】:

此函数向 SOAP API 发出请求,然后使用响应来构建视图。我想缓存这个响应以供离线使用。

func getUserFilesWithUserObj(userObj:User,completionhandler:@escaping (_ userFiles:NSArray, _ status: Bool) -> Void)
        let soapMessage: String = String(format: "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><getFilesByID xmlns=\"http://example.com/\"><_usrID>%@</_usrID><_utStatus>%@</_utStatus></getFilesByID></soap12:Body></soap12:Envelope>",userObj.userId!,"9")

        guard let urlRequest = self.createSoapRequestFromSoapMessage(soapmessage: soapMessage) else
            return
        
        var localPath = AppDelegate.getDownloadFilesFolderPath()
        localPath = localPath.stringByAppendingPathComponent(path: "user-files")

        if FileManager.default.fileExists(atPath: localPath)
            do 
                self.processUserFiles(files: try String(contentsOf: NSURL(fileURLWithPath: localPath) as URL, encoding: .utf8))
             catch let error as NSError  print(error) 
        
        else

            SwiftLoader.show(animated: true)
            Alamofire.request(urlRequest).responseData  (response) in
                SwiftLoader.hide()
                if response.error == nil
                    if response.data != nil
                        let strData = String(data: response.data!, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
                        do 
                            try strData?.write(to: NSURL(string: localPath)! as URL, atomically: false, encoding: .utf8)
                         catch let error as NSError  print(error) 

                        self.processUserFiles(files: strData!)

                        completionhandler(self.arrUserTreatment!, true)
                    
                    completionhandler(NSArray(), false)
                
                else
                    completionhandler(NSArray(), false)
                
            
        
    

这是我在 Xcode 终端中收到的错误消息,

2019-08-19 21:51:57.131031-0400 AppName[412:28510] CFURLCopyResourcePropertyForKey failed because it was passed an URL which has no scheme
Error Domain=NSCocoaErrorDomain Code=518 "The file couldn’t be saved because the specified URL type isn’t supported." UserInfo=NSURL=/var/mobile/Containers/Data/Application/AFFBB2E6-0EB9-4206-9AD5-EDB3AD22A23F/Documents/DownloadFiles/user-files

如何将此响应中的 XML 保存到文件中并稍后重新加载?

【问题讨论】:

您可以使用 UserDefaults 或文件之类的任何内容来保存任何响应。一旦你使用它,你可以删除或释放这些对象。将整个响应保存为字符串,当你想再次使用它时转换它。您也可以使用核心数据,因为您可以只保存您想要的那些值,而不是存储整个 XML 响应,它还可以帮助您轻松使用这些值。 您能否提供这些示例或进一步的参考资料? 【参考方案1】:

localPath 前添加file:// 修复了错误。

var localPath = AppDelegate.getDownloadFilesFolderPath()
localPath = "file://" + localPath.stringByAppendingPathComponent(path: "user-files")

来源:https://***.com/a/39646856/8507637

【讨论】:

以上是关于如何使用 Alamofire.request() 将 XML 肥皂响应保存到文件?的主要内容,如果未能解决你的问题,请参考以下文章

var 请求:Alamofire.Request?使用未声明类型的 Alamofire

更改 Alamofire.SessionManager 的 serverTrustPolicy 以仍然使用***便利方法,如 Alamofire.request

随机获取“网络连接丢失。”迅速使用“Alamofire.request”

如何通过alamofire发布ID和密码

Alamofire.request().responseObject 不返回响应

Alamofire.request 不与自定义对象映射