前言
测试阶段,还未曾放到项目中使用,后续会继续优化调整,初始版本
环境
pod 'Moya', '14.0.0'
Xcode 13.2
用法
1、基本模板
Moya 在对于 API 的封装是基于 enum,通过对于枚举不同端点的不同用法,生成请求。
let gitHubProvider = MoyaProvider<YLHub>()
public enum YLHub {
case zen
case version([String: Any])
}
extension YLHub: TargetType {
public var baseURL: URL { URL(string: "https://uatcjapi.uguoba.com")! }
public var path: String {
switch self {
case .zen:
return "/app/api/v1/Project/GetProjectList"
case .version(_):
return "/inf/api/v1/Version/GetVersionUpdateInfo"
}
}
public var method: Moya.Method {
switch self {
case .zen:
return .get
default:
return .post
}
}
public var task: Task {
switch self {
case .version(let par):
return .requestCompositeParameters(bodyParameters: par, bodyEncoding: JSONEncoding.default, urlParameters: [:])
default:
return .requestPlain
}
}
public var validationType: ValidationType {
return .successCodes
}
// 用于单元测试
public var sampleData: Data {
return "{}".data(using: String.Encoding.utf8)!
}
public var headers: [String: String]? {
return [
"content-type": "application/json;charset=utf-8;",
"platform": "ios",
]
}
}
2. 使用
2.1 get 请求
gitHubProvider.request(.zen) { result in
switch result {
case let .success(response):
if let json = try? response.mapJSON() {
print(json)
} else {
print(" 数据获取失败")
}
case let .failure(error):
print("failure\(error)")
}
}
2.2 post 请求
gitHubProvider.request(.version(parameters!)) { result in
switch result {
case let .success(response):
if let json = try? response.mapJSON() {
print(json)
} else {
print(" 数据获取失败")
}
case let .failure(error):
print("failure\(error)")
}
}
遇到的问题:
1、post请求status: 400、405 在post的task 中,使用了.requestParameters(parameters: par, encoding: URLEncoding.default) 而不是 .requestCompositeParameters(bodyParameters: par, bodyEncoding: JSONEncoding.default, urlParameters: [:]) 解决方法借鉴自:swift 框架 moya post 请求遇到的坑
public var task: Task {
switch self {
case .version(let par):
return .requestCompositeParameters(bodyParameters: par, bodyEncoding: JSONEncoding.default, urlParameters: [:])
// return .requestParameters(parameters: par, encoding: URLEncoding.default)
default:
return .requestPlain
}
}
|