一个简单的get请求接口为例,搭建一个比较完整的网络框架,其中包括Session管理,路由和错误处理
这里以获取用户文章列表接口为例
创建模型
/// 实用泛行实现通用格式
public struct ResponseData<ResultData>: Codable where ResultData: Codable {
let code: String
let message: String
let data: ResultData
}
public struct Post: Codable {
let id: Int
let title: String
let body: String
let userID: Int
}
extension Post {
enum CodingKeys: String, CodingKey {
case id
case title
case body
case userID = "userId" //自定义key
}
}
创建路由PostsApiRouter
常量配置
里面包含baseURL
, 参数key
, header
常用字段定义,或者其他…
import Foundation
/// baseURL
struct ProductionServer {
#if DEBUG
static let baseURL = "http://localhost:3000/"
#else
static let baseURL = "https://jsonplaceholder.typicode.com/"
#endif
}
/// 定义传参key值
struct APIParameterKey {
static let password = "password"
static let email = "email"
static let userId = "userId"
}
/// httpheader
enum HTTPHeaderField: String {
case authentication = "Authorization"
case contentType = "Content-Type"
case acceptType = "Accept"
case acceptEncoding = "Accept-Encoding"
}
/// 传输类型
enum ContentType: String {
case json = "application/json"
}
路由PostsApiRouter
import Alamofire
/// 文章类路由
enum PostsApiRouter{
case getPosts(userId: Int)
}
extension PostsApiRouter: APIConfiguration {
/// 请求方法
var method: HTTPMethod {
switch self {
case .getPosts:
return .get
}
}
///请求路径
var path: String {
switch self {
case .getPosts:
return "posts"
}
}
/// 请求参数
var parameters: Parameters? {
switch self {
case .getPosts(let userId):
return [APIParameterKey.userId : userId]
}
}
//重写encoding
var encoding: ParameterEncoding {
switch method {
case .get:
return URLEncoding.default
default:
return JSONEncoding.default
}
}
///构建request
func asURLRequest() throws -> URLRequest {
let url = try ProductionServer.baseURL.asURL()
var urlRequest = URLRequest(url: url.appendingPathComponent(path))
//http method
urlRequest.httpMethod = method.rawValue
// header:
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.acceptType.rawValue)
urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue)
do {
urlRequest = try encoding.encode(urlRequest, with: parameters)
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
return urlRequest
}
}
创建请求管理类
import Foundation
import RxSwift
import Alamofire
import PromiseKit
public final class AFApiProvider {
private static var _apiProvider = AFApiProvider(session: {
() -> Session in
///自定义session
let sessionConfig = URLSessionConfiguration.default
sessionConfig.headers = .default
let serverTrustManager = AFTrustManager