✅ Xcode 12.0
✅ Swift 5+
✅ iOS 14
GXBaseAPI
доступен через Swift Package Manager.
Используя Xcode 12 и выше, нужно зайти в File -> Swift Packages -> Add Package Dependency
ввести адрес репозитория.
Выбираем последнюю версию по тегу, ждем синхронизации, вуаля, можно использовать утилитки)
При обновлении пакета, можно воспользоваться File -> Swift Packages -> Update to Latest packages versions
SomeAPIManager
и подпишите его под протокол BaseAPIManagerProtocol
struct SomeAPIManager: BaseAPIManagerProtocol {
let baseURL: String = *some base url*
....
}
extension SomeAPIManager {
enum API {
case getSome
case getDetail(Int) // - ассоциативные значения очень помогают
case getSomeWithQuery(HTTPQuery) // - если нужны query params, под капотом - [String: String]
}
}
extension SomeAPIManager.API: GXBaseAPI.APICall {
var path: String {
switch self {
case .getSome:
return "/path/get/"
case let .getDetail(id):
return "/path/\(String(id))/"
}
}
var method: GXBaseAPI.HTTPMethod {
switch self {
case .getSome, .getSomeDetail:
return .GET
case .someCase:
return .PATCH
}
}
var headers: GXBaseAPI.HTTPHeaders? {
switch self {
case .getSome:
return [
"Authorization": "",
]
}
}
}
struct SomeAPIManager: BaseAPIManagerProtocol {
...
// пример POST, params - ваше body
func loginUser(params: LoginRequest) -> AnyPublisher<ResponseModel<LoginResponse>, Error> {
return fetch(endpoint: API.loginUser, params: params)
}
// пример GET + можно декодить ответ с сервера из snake_case в swiftCase
// decoder: .snakeCaseConverting)
func getUser() -> AnyPublisher<ResponseModel<UserInfoModel>, Error> {
return fetch(endpoint: API.getUserInfo, decoder: .snakeCaseConverting)
}
// можно комбинировать
func patchUserInfo(id: Int, params: UpdateUserInfoModel) -> AnyPublisher<ResponseModel<UserInfoModel>, Error> {
return fetch(endpoint: API.updateUserInfo(id), params: params, decoder: .snakeCaseConverting)
}
// пример загрузки аватара на сервер
func uploadAvatar(image: UIImage) -> AnyPublisher<ResponseModel<UserInfoModel>, Error> {
let mediaImage = Media(withImage: image, forKey: "avatar", compressionQuality: 0.3)
let formData = MultipartFormDataRequest()
let dataBody = formData.createDataBody(withParameters: nil, media: [mediaImage!])
return upload(endpoint: API.uploadAvatar, with: formData.boundary, and: dataBody, decoder: .snakeCaseConverting)
}
}
🔷🔷🔷 https://garpix.com 🔷🔷🔷
link |
Stars: 2 |
Last commit: 2 years ago |
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics