GXBaseAPI - GARPIX Networking Layer

Related tags

Networking GXBaseAPI
Overview

GXBaseAPI

GARPIX Networking Layer

URLSession + Combine + Codable + Generics

  1. Все чисто на URLSession, нету Alamoifire
  2. Есть логгер для запросов
  3. Логи ошибок Codable
  4. Обработка 204
  5. Загрузка картинок

🔷 Требования

      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

🔷 Documentation

  1. Создайте класс/структуру, например SomeAPIManager и подпишите его под протокол BaseAPIManagerProtocol
struct SomeAPIManager: BaseAPIManagerProtocol {
    let baseURL: String = *some base url*
    ....
}
  1. Нам нужен enum с кейсами всех эндпоинтов. Реализовать можно вот так:
extension SomeAPIManager {
    enum API {
        case getSome
        case getDetail(Int)  // - ассоциативные значения очень помогают
        case getSomeWithQuery(HTTPQuery)  // - если нужны query params, под капотом - [String: String]
    }
}
  1. Далее настраиваем эндпоинты - path, headers, methods
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": "",
            ]
        }
    }
}
  1. И теперь создаем сами функции для запросов. С помощью функции fetch/upload
struct SomeAPIManager: BaseAPIManagerProtocol {
    ...

    // пример POST, params - ваше body
    func loginUser(params: LoginRequest) -> AnyPublisher
   
    , 
    Error> {
        
    return 
    fetch(
    endpoint: API.
    loginUser, 
    params: params)
    }

    
    // пример GET + можно декодить ответ с сервера из snake_case в swiftCase

        
    // decoder: .snakeCaseConverting)

        
    func 
    getUser() 
    -> AnyPublisher
    
     
      , 
      Error> {
        
      return 
      fetch(
      endpoint: API.
      getUserInfo, 
      decoder: .
      snakeCaseConverting)
    }

    
      // можно комбинировать

          
      func 
      patchUserInfo(
      id: 
      Int, 
      params: UpdateUserInfoModel) 
      -> AnyPublisher
      
       
        , 
        Error> { 
        return 
        fetch(
        endpoint: API.
        updateUserInfo(id), 
        params: params, 
        decoder: .
        snakeCaseConverting) } 
        // пример загрузки аватара на сервер 
         
        func 
        uploadAvatar(
        image: UIImage) 
        -> AnyPublisher
        
         
          , 
          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) } }
         
        
       
      
     
    
   
  
  1. Для подробного изучения смотрите папку Sources

🔷 🔷 🔷 https://garpix.com 🔷 🔷 🔷

You might also like...
Another network wrapper for URLSession. Built to be simple, small and easy to create tests at the network layer of your application.
Another network wrapper for URLSession. Built to be simple, small and easy to create tests at the network layer of your application.

Another network wrapper for URLSession. Built to be simple, small and easy to create tests at the network layer of your application. Install Carthage

Generic Network Layer created using Swift.

Generic-Network-Layer_iOS Generic Network Layer created using URLSession. Networking is an essential element in app development, and you'll need API c

NSURLSession network abstraction layer, using Codable and Decodable for response and Encodable for request. ⚙️🚀
NSURLSession network abstraction layer, using Codable and Decodable for response and Encodable for request. ⚙️🚀

SONetworking NSURLSession network abstraction layer, using Codable and Decodable for response and Encodable for request. Project Folder and File Struc

Alamofire network layer

NVNetworkRequest Alamofire network layer Installation Add this to your Package dependencies: dependencies: [ .package(url: "https://github.com/vin

Say goodbye to the Fat ugly singleton Network Manager with this Network Layer

MHNetwork Protocol Oriented Network Layer Aim to avoid having bloated singleton NetworkManager Philosophy the main philosophy behind MHNetwork is to h

Network abstraction layer written in Swift.
Network abstraction layer written in Swift.

Moya 15.0.0 A Chinese version of this document can be found here. You're a smart developer. You probably use Alamofire to abstract away access to URLS

Async network layer with Combine
Async network layer with Combine

Version 1.0.10 Currently Available Platform Version iOS 12.0 tvOS 10.0 macOS 10.15 watchOS 3.0 macCatalyst 13.0 Hover is a Network layer which uses Ap

Approov-service-ios-swift-grpc - Approov service layer for iOS clients using GRPC

Approov Service for GRPC A wrapper for the Approov SDK to enable easy integratio

Http - Demo for Http Layer

http Example To run the example project, clone the repo, and run pod install fro

Comments
  • Some question about using

    Some question about using

    Can you explain how to handle case getSomeWithQuery(HTTPQuery)

    And what is ResponseModel? Can you show the example for LoginRequest, LoginResponse, and their conforming protocols?

    How to set token in header programmatically?

    If you share one good example with us, it will be perfect.

    opened by matghazaryan 0
  • Добавил функции и константы для более удобной пагинации

    Добавил функции и константы для более удобной пагинации

    Changes

    1. [s] - новые константы для String для стандартных ключей в Django для пагинации
    2. [s] - сделал функцию, которая сразу создает словарик HTTPQuery с пейджа и пейджа сайза

    Checklist

    • [x] Убрал ли я повторяющийся код?
    • [x] Сделал ли я нужные модификаторы доступа к своим свойствам, функциям и моделям?
    • [ ] Задача сделана полностью?
    • [x] Убрал ли я лишние import ?
    • [x] Убрал ли я сложные операции с main thread?
    • [x] Вынес ли я "магические числа" в константы ?
    • [x] Можно ли мой код заменить нативными функциями?
    • [x] Называл ли я правильно свои переменные, классы, методы и т.д. ?
    • [x] Обработал ли я все ошибки?
    • [x] Проверил ли я работу с темной темой?
    • [x] Есть ли утечки памяти? Использовал ли я weak ?
    • [x] Проверил ли я верстку на разных экранах и ориентациях?
    • [x] Проверил ли я на разных версиях iOS (iOS14 и iOS15)?
    • [x] Проверил ли я, что будет, если пользователь запретит доступ к пушам, камере и т.д. ?
    • [x] Проверил ли я работу приложения при плохом интернете ?
    • [x] Потестил ли я, что будет, если запрос на сервер будет ошибочным?
    • [x] Сделал ли я pull с master/main/dev веток, перед тем как публиковать свои изменения? Исправил ли я все конфликты?
    • [x] Убрал ли я не нужные print() / debugPrint()?
    • [x] Если я добавил верстку, предоставил ли я скрины в MR? Показывал ли я дизайнеру конечный результат?
    opened by WeDontNeedTo 0
Releases(1.0.0)
Owner
GARPIX iOS team
GARPIX iOS team
Sherlock Holmes of the networking layer. :male_detective:

ResponseDetective is a non-intrusive framework for intercepting any outgoing requests and incoming responses between your app and your server for debu

Netguru 1.9k Dec 24, 2022
Advanced Networking Layer Using Alamofire with Unit Testing

Advanced Networking Layer Using Alamofire with Unit Testing

Ali Fayed 8 May 23, 2022
An elegant yet powerful iOS networking layer inspired by ActiveRecord.

Written in Swift 5 AlamoRecord is a powerful yet simple framework that eliminates the often complex networking layer that exists between your networki

Tunespeak 19 Nov 19, 2022
🤵🏽‍♀️ Janet — A thin HTTP networking layer built on URLSession for simple, declarative endpoint specification leveraging the power of async/await.

????‍♀️ Janet — Just another networking kit — A thin HTTP networking layer built on URLSession for simple, declarative endpoint specification leveragi

Niklas Holloh 3 Sep 6, 2022
Dratini is a neat network abstraction layer.

Dratini Dratini is a neat network abstraction layer. If you are looking for a solution to make your network layer neat, Dratini is your choice. Dratin

Kevin Lin 37 Jan 29, 2022
Network abstraction layer written in Swift.

Moya 14.0.0 A Chinese version of this document can be found here. You're a smart developer. You probably use Alamofire to abstract away access to URLS

Moya 14.4k Jan 1, 2023
Elegant network abstraction layer in Swift.

Elegant network abstraction layer in Swift. 中文 Design Features Requirements Communication Installation Usage Base Usage - Target - Request - Download

null 100 Dec 9, 2022
Lightweight network abstraction layer, written on top of Alamofire

TRON is a lightweight network abstraction layer, built on top of Alamofire. It can be used to dramatically simplify interacting with RESTful JSON web-

MLSDev 528 Dec 26, 2022
A generic network layer written in swift

SwiftyNet 1.0.0 A generic network layer written in swift. you can use it as an abstraction layer above Alamofire with generic returned types. Installa

Mohamed Salah Zidane 17 Oct 11, 2021
🔌 Non-blocking TCP socket layer, with event-driven server and client.

Original authors Honza Dvorsky - http://honzadvorsky.com, @czechboy0 Matthias Kreileder - @matthiaskr1 At the request of the original authors, we ask

Vapor Community 574 Dec 7, 2022