用于拼接地址的常量
直接上代碼,這塊代碼是封裝在NetAddressFile.swift類中
import Foundation
//測試地址
let kURLHeader = "http://192.168.2.17:9090/"
//請求的命名空間
let kNameSpace = "http://tempuri.org/"
//服務(wù)地址
enum Service:String {
case UserService = "UserService.asmx"
case ProductService = "ProductService.asmx"
case StockService = "StockService.asmx"
}
//服務(wù)器接口地址
enum ServiceAction{
enum UserServiceAction:String{
case RegistAction = "Regist"
case LogonAction = "Logon"
case LogonTAction = "LogonT"
case GetParameter = "GetParameter"
}
enum ProductServiceAction:String{
case GetProductAction = "GetProduct"
case AddProductAction = "AddProduct"
}
enum StockServiceAction :String{
case AddStockAction = "AddStock"
case UpdateCountAction = "UpdateCount"
case GetStockAction = "GetStock"
}
}
以下代碼是NetWorkManager類,我們所用來請求數(shù)據(jù)的類
該類里面共有四個方法:
public func postRequest(_ service:String,action:String,paramValues:String,success:@escaping SuccessBlock){}
private func getURLRequest(_ action:String,URL:Foundation.URL,soapMsg:String)->URLRequest{}
private func getURL(_ service:String,action:String)->URL{}
private func toSoapMessage(_ action: String, pams: String) -> String {}
以上四個方法中我們使用第一個方法public func postRequest(_ service:String,action:String,paramValues:String,success:@escaping SuccessBlock){}
請求數(shù)據(jù),其他三個是為第一個服務(wù)的,以下是詳細(xì)代碼。
import UIKit
import Alamofire
//請求成功的回調(diào)
typealias SuccessBlock = (NSData)->Void
//請求失敗的回調(diào)
typealias FaileBlock = (NSError)->Void
class NetWorkManager: NSObject{
var webData: NSMutableData!
var currentService: String = String()
var currentAction: String = String()
var successBlock: SuccessBlock?
var fauleBlock: FaileBlock?
// 請求數(shù)據(jù)的時候使用這個類就可以
public func postRequest(service:String,action:String,paramValues:String,success:SuccessBlock){
self.successBlock = success
self.currentService = service
self.currentAction = action
let URL = getURL(service, action: action)
print(URL)
let soapMsg:String = toSoapMessage(action, pams: paramValues)
let urlRequest: URLRequest = getURLRequest(action, URL: URL, soapMsg: soapMsg)
Alamofire.request(urlRequest).responseData { response in
if response.result.isSuccess{
if let successful = self.successBlock{
successful(response.data!)
}
}else{
print("請求數(shù)據(jù)失敗----》\(response.result.error?.description)")
}
}
}
private func getURLRequest(_ action:String,URL:Foundation.URL,soapMsg:String)->URLRequest{
var request:URLRequest = URLRequest(url: URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 1)
request.setValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
let soapAction = kNameSpace+action
print("\(soapAction)")
request.setValue(soapAction, forHTTPHeaderField: "SOAPAction")
request.setValue("\(soapMsg.characters.count)", forHTTPHeaderField: "Content-Length")
request.httpMethod = "POST"
request.httpBody = soapMsg.data(using: String.Encoding.utf8)
return request
}
/*
Param:
service:服務(wù)地址 eg. ProductService.asmx
action: 服務(wù)端口 eg. GetProduct
Return: "http://192.168.2.17:9090/ProductService.asmx?op=GetProduct"
*/
private func getURL(service:String,action:String)->NSURL{
let urlStr = kURLHeader+service+"?op="+action
return NSURL(string: urlStr)!
}
/*
Description: 拼接請求的字符串
Param:
action:服務(wù)端口 eg. GetProduct
pams:需要上傳的參數(shù)
Return: 字符串
*/
private func toSoapMessage(action: String, pams: String) -> String {
var message: String = String()
message += "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
message += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
message += "<soap:Body>"
message += "<\(action) xmlns=\"\(kNameSpace)\">"
message += "\(pams)"
message += "</\(action)>"
message += "</soap:Body>"
message += "</soap:Envelope>"
return message
}
}
上面的類寫好之后,我們就可以使用了。
soap.png
我們寫了那么多就是為了,拼接出SOAP請求(參考圖片中的SOAP請求)
使用方法如下:
// 直接調(diào)用這個方法就可以發(fā)起請求
比如:在我的后臺方法中要求傳入一個名為CountingEntryTable的數(shù)組
func postData(){
var message = "<data>"
for item in self.dataArray {
//FileDateModel是我自己定義的一個Model,可以修改為你們只的數(shù)據(jù)
let fileModel:FileDataModel = item as! FileDataModel
message += "<CountingEntryTable>"
message += "<skuCode>\(fileModel.skuCode!)</skuCode>"
message += "<skuName>\(fileModel.skuName!)</skuName>"
message += "<onHandQty>\(fileModel.onhandQty!)</onHandQty>"
message += "<countQty>\(fileModel.countQty!)</countQty>"
message += "<varianceQty>\(fileModel.varianceQty!)</varianceQty>"
message += "</CountingEntryTable>"
}
message += "</data>"
/*
現(xiàn)在的message消息為:
<data>
<CountingEntryTable>
<skuCode>9787512408371</skuCode>
<skuName>C語言</skuName>
<onHandQty>20</onHandQty>
<countQty>10</countQty>
<varianceQty>10</varianceQty>
</CountingEntryTable>
<CountingEntryTable>
<skuCode>9787121247453</skuCode>
<skuName>iOS開發(fā)</skuName>
<onHandQty>10</onHandQty>
<countQty>12</countQty>
<varianceQty>-2</varianceQty>
</CountingEntryTable>
</data>
*/
/*
最終的message為:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<AddCount xmlns="http://tempuri.org/">
<data>
<CountingEntryTable>
<skuCode>9787512408371</skuCode>
<skuName>C語言</skuName>
<onHandQty>20</onHandQty>
<countQty>10</countQty>
<varianceQty>10</varianceQty>
</CountingEntryTable>
<CountingEntryTable>
<skuCode>9787121247453</skuCode>
<skuName>iOS開發(fā)</skuName>
<onHandQty>10</onHandQty>
<countQty>12</countQty>
<varianceQty>-2</varianceQty>
</CountingEntryTable>
</data>
</AddCount>
</soap:Body></soap:Envelope>
*/
//最終的message當(dāng)我們調(diào)用下面此方法后會自動生成,因為我們再`NetWorkManager`類中會進一步處理,該方法為toSoapMessage
//先創(chuàng)建一個networkManager對象
var networkManager: NetWorkManager = NetWorkManager()
//該方法就是我們最終使用的方法,返回data數(shù)據(jù),數(shù)據(jù)類型就是上圖中的SOAP響應(yīng)
networkManager.postRequest(Service.CountingEntry.rawValue, action: ServiceAction.CountEntryServiceAction.AddCount.rawValue, paramValues: message, success:{
data in
// self.parse = NSXMLParser(data: data)
// self.parse!.delegate = self
// self.parse!.parse()
let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
print("\(string!)")
})
}