Siwft网络请求-Alamofire

一个简单的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值