EagleNet

2.0.2

Simple lightweight networking layer written on top of URLSession. This will provide a clean, separate layer for networking.
AnbalaganD/EagleNet

What's New

2.0.2

2025-12-28T07:40:53Z

The Linux build issue has been resolved.

Full Changelog: 2.0.1...2.0.2

This library aims to provide a simple and elegant approach to writing network requests. It's designed to be lightweight, adding a thin layer on top of URLSession without excessive engineering overhead.

Our primary objectives are:

  • Lightweight networking library: Keep the library small and efficient.
  • Easy to maintain: Prioritize clear code and modular design for maintainability.
  • Beginner friendly: Make the library accessible to developers of all levels.
  • Well documented: Provide comprehensive documentation to guide usage.
  • Customizable and testable: Allow for flexibility and ensure code quality through testing.

Currently, this library supports basic HTTP data requests (GET, POST, PUT, DELETE), custom HTTP methods, and includes a small file upload feature using multipart/form-data. These capabilities address the majority of network communication needs in most applications.

For detailed information on feature status, please refer to the Roadmap file.

See the complete documentation here: Documentation

Swift Package Manager (SPM)

EagleNet is available through SPM. Use the URL below to add it as a dependency.

dependencies: [
    .package(url: "https://github.com/AnbalaganD/EagleNet", .upToNextMajor(from: "2.0.2"))
]

Making a GET Request

import EagleNet

struct User: Decodable {
    let id: Int
    let name: String
    let email: String
}

// Basic GET request
let user: User = try await EagleNet.get(
    url: "https://api.example.com/users/1"
)

// Get raw response data
let (data, response) = try await EagleNet.get(
    url: "https://api.example.com/users/1"
)

Making a POST Request

struct CreateUser: Encodable {
    let name: String
    let email: String
}

struct UserResponse: Decodable {
    let id: Int
    let name: String
}

let newUser = CreateUser(name: "Anbalagan D", email: "anbu94p@gmail.com")
let response: UserResponse = try await EagleNet.post(
    url: "https://api.example.com/users",
    body: newUser
)

// Get raw response data
let (data, urlResponse) = try await EagleNet.post(
    url: "https://api.example.com/users",
    body: newUser
)

File Upload

let imageData = // ... your image data ...
let response: UploadResponse = try await EagleNet.upload(
    url: "https://api.example.com/upload",
    parameters: [
        .file(
            key: "avatar",
            fileName: "profile.jpg",
            data: imageData,
            mimeType: .jpegImage
        ),
        .text(key: "username", value: "Anbu")
    ],
    progress: { bytesTransferred, totalBytes in
        let progress = Float(bytesTransferred) / Float(totalBytes)
        print("Upload progress: \(Int(progress * 100))%")
    }
)

// Get raw response data
let (data, urlResponse) = try await EagleNet.upload(
    url: "https://api.example.com/upload",
    parameters: [
        .file(key: "avatar", fileName: "profile.jpg", data: imageData, mimeType: .jpegImage)
    ]
)

Request Interceptors

struct AuthInterceptor: RequestInterceptor {
    let token: String
    
    func modify(request: URLRequest) async throws -> URLRequest {
        var modifiedRequest = request
        modifiedRequest.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
        return modifiedRequest
    }
}

// Add interceptor to network service
EagleNet.addRequestInterceptor(
    AuthInterceptor(token: "your-auth-token")
)

Response Interceptors

struct LoggingInterceptor: ResponseInterceptor {
    func modify(data: Data, urlResponse: URLResponse) async throws -> (Data, URLResponse) {
        if let httpResponse = urlResponse as? HTTPURLResponse {
            print("Response Status Code: \(httpResponse.statusCode)")
            print("Response Headers: \(httpResponse.allHeaderFields)")
            
            if let responseString = String(data: data, encoding: .utf8) {
                print("Response Body: \(responseString)")
            }
        }
        return (data, urlResponse)
    }
}

// Add response interceptor to network service
EagleNet.addResponseInterceptor(LoggingInterceptor())

Custom HTTP Methods

// Using custom HTTP methods like PATCH
struct UpdateStatus: Encodable {
    let status: String
}

let patchRequest = DataRequest(
    url: "https://api.example.com/users/1",
    httpMethod: .custom("PATCH"),
    body: UpdateStatus(status: "active")
)

let response: User = try await EagleNet.execute(patchRequest)

Configuration

// Custom URLSession configuration
let customService = EagleNet.defaultService(
    urlSession: URLSession(configuration: .ephemeral),
    jsonEncoder: JSONEncoder(),
    jsonDecoder: JSONDecoder()
)

EagleNet.configure(networkService: customService)

Author

Anbalagan D

License

EagleNet is available under the MIT license. See the LICENSE file for more info.

Description

  • Swift Tools 5.9.0
View More Packages from this Author

Dependencies

  • None
Last updated: Wed Jan 28 2026 11:59:27 GMT-1000 (Hawaii-Aleutian Standard Time)