swift3.0下使用Alamofire調用Webservice遇到的一些問題以及解決方案。 首先是針對沒有證書的https下的介面處理問題(ps:不推薦在正式版本中使用),manager.request替換掉了Alamofire.request。 針對soap協議,使用mutableURLRequ ...
swift3.0下使用Alamofire調用Webservice遇到的一些問題以及解決方案。
首先是針對沒有證書的https下的介面處理問題(ps:不推薦在正式版本中使用),manager.request替換掉了Alamofire.request。
let manager = Alamofire.SessionManager.default manager.delegate.sessionDidReceiveChallenge = { session, challenge in var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling var credential: URLCredential? if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { disposition = URLSession.AuthChallengeDisposition.useCredential credential = URLCredential(trust: challenge.protectionSpace.serverTrust!) } else { if challenge.previousFailureCount > 0 { disposition = .cancelAuthenticationChallenge } else { credential = manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace) if credential != nil { disposition = .useCredential } } } return (disposition, credential) }
針對soap協議,使用mutableURLRequest來進行請求。
mutableURLRequest.setValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") mutableURLRequest.setValue(action, forHTTPHeaderField: "SOAPAction") mutableURLRequest.setValue(String(soapMsg.characters.count), forHTTPHeaderField: "Content-Length") mutableURLRequest.httpMethod = "POST" mutableURLRequest.httpBody = soapMsg.data(using: String.Encoding.utf8)
得到返回的值包含來xml命名空間和其中的有效結果。通過第三方庫SWXMLHash來進行XML的解析,再針對解析得到的Json字元串利用JSONSerialization獲得相應的字典。
manager.request(mutableURLRequest as URLRequest).responseData{ response in //debugPrint(response) let xml = SWXMLHash.parse(response.data!) let a: String = (xml["soap:Envelope"]["soap:Body"]["FindUserNewResponse"]["FindUserNewResult"].element?.text)! print(a) if !a.isEmpty && a != "err:賬號或密碼有誤!"{ let data = a.data(using: String.Encoding.utf8)! as Data let a_dic = try? JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) if let dict = a_dic as? Dictionary<String, String> { print(dict["姓名"]!) print(dict["地區"]!) callback?(true) } }else{ callback?(false) } }
註意上面使用了一個回調函數,這是因為Alamofire調用WebService是非同步的方式,這裡通過isOk來判定登陸是否成功。
func reqWebService(values: Dictionary<String, String>, callback: ((_ isOk: Bool)->Void)?){}