测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布日期最后发布日期 | 2017年9月 |
Swift 版本Swift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Jérémy Marchand 维护。
依赖项 | |
Alamofire | >= 0 |
AEXML | >= 0 |
AlamofireXMLRPC 将 XML RPC 功能带到了 Alamofire。它的目标是提供一个简单的方法来执行 XMLRPC 调用并平滑地检索响应。
XML 是通过 AEXML 内部处理的。
以下是一个请求和响应处理程序的示例
let data: NSData = ...
let params: [Any] = [42, "text", 3.44, Date(), data]
AlamofireXMLRPC.request("https://:8888/xmlrpc", methodName: "foo", parameters: params).responseXMLRPC { (response: DataResponse<XMLRPCNode>) -> Void in
switch response.result {
case .success(let value):
if let message = value[0].string, age = value[1]["age"].int32 {
...
}
case .failure:
...
}
它将生成以下调用,并让您从 XMLRPC 服务中解析相应的答案
<!-- request -->
<methodCall>
<methodName>foo</methodName>
<params>
<param>
<value>
<int>42</int>
</value>
</param>
<param>
<value>
<string>text</string>
</value>
</param>
<param>
<value>
<double>3.44</double>
</value>
</param>
<param>
<value>
<dateTime.iso8601>19980717T14:08:55</dateTime.iso8601>
</value>
</param>
<param>
<value>
<base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64>
</value>
</param>
</params>
</methodCall>
<!-- response -->
<methodResponse>
<params>
<param>
<value>
<string>Hello world!</string>
</value>
</param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value>
<string>John Doe</string>
</value>
</member>
<member>
<name>age</name>
<value>
<int>36</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
// Call XMLRPC service with the sharedManager of Alamofire
AlamofireXMLRPC.request("https://xmlrpcservice", method:"foo" parameters: [1,2.0,"ddd",["key":"value"]])
// Call XMLRPC service with your custom manager
manager.requestXMLRPC("https://xmlrpcservice", method:"foo" parameters: [1,2.0,"ddd",["key":"value"]])
实现 XMLRPCRequestConvertible
协议的类型可以用来构造 XMLRPC 调用。
public protocol XMLRPCRequestConvertible {
var url: URLConvertible { get }
var methodName: String { get }
var parameters: [Any]? { get }
var headers: [String : String]? { get }
}
struct MyRequest: XMLRPCRequestConvertible {
...
}
let request = MyRequest(...)
Alamofire.request(request) // Call XMLRPC service with Alamofire
AlamofireXMLRPC 使用以下映射将 Swift 值映射到 XML RPC 值
Swift | 示例 | XMLRPC | 注意 |
---|---|---|---|
String | “foo” | <string>foo</string> | |
Int, Int32, Int16, Int8, UInt16, UInt8 | 42 | <int>42</int> | XML RPC 整数是 32 位,Int 值将被转换为 Int32 |
Bool | true | <boolean>1</boolean> | |
Double, Float | 3.44 | <double>3.44</double> | |
Date | Date() | <dateTime.iso8601>19980717T14:08:55</dateTime.iso8601> | |
Data | Data() | <base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64> |
默认情况下,其他类型将被映射为 XML RPC 字符串并使用默认的字符串表示。但是,您可以通过采用协议 XMLRPCRawValueRepresentable
来为自定义类型提供自己的映射。
enum XMLRPCValueKind: String {
case integer = "int"
case double = "double"
case boolean = "boolean"
case string = "string"
case dateTime = "dateTime.iso8601"
case base64 = "base64"
}
protocol XMLRPCRawValueRepresentable {
static var xmlrpcKind: XMLRPCValueKind { get }
var xmlrpcRawValue: String { get }
init?(xmlrpcRawValue: String)
}
Swift 数组 [Any]
可转换为 XMLRPC 数组。
[1,"too"]
同样,字典 [String:Any]
可转换为 XMLRPC 结构。
["name":"John Doe","age":35]
XMLRPC 响应通过方法 responseXMLRPC(completionHandler: DataResponse<XMLRPCNode> -> Void)
处理。响应的 XMLRPC 参数被映射到 XMLRPCNode
。这允许您轻松地从复杂结构或树中提取数据。
对于每个 XMLRPCNode,您可以通过索引或通过字符串键访问子节点。内部将检索 XMLRPC 数组和结构的子项。
aRequest.responseXMLRPC{ (response: DataResponse<XMLRPCNode>) -> Void in
switch response.result {
case .success(let value):
if let message = value[0]["aKey"][9].string {
...
}
case .failure:
...
}
}
无需担心解包和检查值类型或存在性。选项管理仅在您使用可选获取器请求 Swift 值时才执行。
例如,您可以在不担心对象树实际是否存在的情况下调用 value[0]["aKey"][9]
。
var array: [XMLRPCNode]?
var dictionary: [String:XMLRPCNode]?
var string: String?
var int32: Int32?
var double: Double?
var bool: Bool?
var date: Date?
var data: Data?
var count: Int?
AlamofireXMLRPC 在 MIT 许可下发布。有关详细信息,请参阅 LICENSE。