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.
- 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
) 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
Check complete documentation here: Documentation
EagleNet is available through SPM. Use below URL to add as a dependency
dependencies: [
.package(url: "https://github.com/AnbalaganD/EagleNet", .upToNextMajor(from: "1.0.9"))
]
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"
)
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
)
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))%")
}
)
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")
)
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())
EagleNet is available under the MIT license. See the LICENSE file for more info.