{"id":15813778,"url":"https://github.com/anbalagand/eaglenet","last_synced_at":"2026-01-28T07:11:27.041Z","repository":{"id":253801850,"uuid":"844572749","full_name":"AnbalaganD/EagleNet","owner":"AnbalaganD","description":"Simple lightweight networking layer written on top of URLSession. This will provide a clean, separate layer for networking.","archived":false,"fork":false,"pushed_at":"2024-10-18T06:12:06.000Z","size":31,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-07T16:48:11.913Z","etag":null,"topics":["async","async-await","fileupload","http","https","interceptor","ios","json","macos","networking","parsing","swift","tvos","urlsession"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AnbalaganD.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-19T14:29:28.000Z","updated_at":"2024-10-18T06:12:10.000Z","dependencies_parsed_at":"2024-08-19T17:05:52.596Z","dependency_job_id":"0b4dc044-88ee-4020-a9c4-e5134c969f92","html_url":"https://github.com/AnbalaganD/EagleNet","commit_stats":null,"previous_names":["anbalagand/eaglenet"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnbalaganD%2FEagleNet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnbalaganD%2FEagleNet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnbalaganD%2FEagleNet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnbalaganD%2FEagleNet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AnbalaganD","download_url":"https://codeload.github.com/AnbalaganD/EagleNet/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246569006,"owners_count":20798341,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","async-await","fileupload","http","https","interceptor","ios","json","macos","networking","parsing","swift","tvos","urlsession"],"created_at":"2024-10-05T04:05:46.325Z","updated_at":"2026-01-28T07:11:27.034Z","avatar_url":"https://github.com/AnbalaganD.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"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. \n\n#### Our primary objectives are:\n\n- **Lightweight networking library:** Keep the library small and efficient.\n- **Easy to maintain:** Prioritize clear code and modular design for maintainability.\n- **Beginner friendly:** Make the library accessible to developers of all levels.\n- **Well documented:** Provide comprehensive documentation to guide usage.\n- **Customizable and testable:** Allow for flexibility and ensure code quality through testing.\n\n\nCurrently, 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.\u003cbr\u003e\u003cbr\u003e\n\n\nFor detailed information on feature status, please refer to the [Roadmap](https://github.com/AnbalaganD/EagleNet/wiki/Roadmap) file.\n\u003cbr\u003e\u003cbr\u003e\nSee the complete documentation here: [Documentation](https://swiftpackageindex.com/AnbalaganD/EagleNet/main/documentation/eaglenet)\n\u003cbr\u003e\u003cbr\u003e\n\n### Swift Package Manager (SPM)\u003cbr/\u003e [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FAnbalaganD%2FEagleNet%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/AnbalaganD/EagleNet) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FAnbalaganD%2FEagleNet%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/AnbalaganD/EagleNet)\n\nEagleNet is available through [SPM](https://swiftpackageindex.com/AnbalaganD/EagleNet). Use the URL below to add it as a dependency.\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/AnbalaganD/EagleNet\", .upToNextMajor(from: \"2.0.3\"))\n]\n```\n\n### Making a GET Request\n\n```swift\nimport EagleNet\n\nstruct User: Decodable {\n    let id: Int\n    let name: String\n    let email: String\n}\n\n// Basic GET request\nlet user: User = try await EagleNet.get(\n    url: \"https://api.example.com/users/1\"\n)\n\n// Get raw response data\nlet (data, response) = try await EagleNet.get(\n    url: \"https://api.example.com/users/1\"\n)\n```\n\n### Making a POST Request\n\n```swift\nstruct CreateUser: Encodable {\n    let name: String\n    let email: String\n}\n\nstruct UserResponse: Decodable {\n    let id: Int\n    let name: String\n}\n\nlet newUser = CreateUser(name: \"Anbalagan D\", email: \"anbu94p@gmail.com\")\nlet response: UserResponse = try await EagleNet.post(\n    url: \"https://api.example.com/users\",\n    body: newUser\n)\n\n// Get raw response data\nlet (data, urlResponse) = try await EagleNet.post(\n    url: \"https://api.example.com/users\",\n    body: newUser\n)\n```\n\n### File Upload\n\n```swift\nlet imageData = // ... your image data ...\nlet response: UploadResponse = try await EagleNet.upload(\n    url: \"https://api.example.com/upload\",\n    parameters: [\n        .file(\n            key: \"avatar\",\n            fileName: \"profile.jpg\",\n            data: imageData,\n            mimeType: .jpegImage\n        ),\n        .text(key: \"username\", value: \"Anbu\")\n    ],\n    progress: { bytesTransferred, totalBytes in\n        let progress = Float(bytesTransferred) / Float(totalBytes)\n        print(\"Upload progress: \\(Int(progress * 100))%\")\n    }\n)\n\n// Get raw response data\nlet (data, urlResponse) = try await EagleNet.upload(\n    url: \"https://api.example.com/upload\",\n    parameters: [\n        .file(key: \"avatar\", fileName: \"profile.jpg\", data: imageData, mimeType: .jpegImage)\n    ]\n)\n```\n\n### Request Interceptors\n\n```swift\nstruct AuthInterceptor: RequestInterceptor {\n    let token: String\n    \n    func modify(request: URLRequest) async throws -\u003e URLRequest {\n        var modifiedRequest = request\n        modifiedRequest.addValue(\"Bearer \\(token)\", forHTTPHeaderField: \"Authorization\")\n        return modifiedRequest\n    }\n}\n\n// Add interceptor to network service\nEagleNet.addRequestInterceptor(\n    AuthInterceptor(token: \"your-auth-token\")\n)\n```\n\n### Response Interceptors\n```swift\nstruct LoggingInterceptor: ResponseInterceptor {\n    func modify(data: Data, urlResponse: URLResponse) async throws -\u003e (Data, URLResponse) {\n        if let httpResponse = urlResponse as? HTTPURLResponse {\n            print(\"Response Status Code: \\(httpResponse.statusCode)\")\n            print(\"Response Headers: \\(httpResponse.allHeaderFields)\")\n            \n            if let responseString = String(data: data, encoding: .utf8) {\n                print(\"Response Body: \\(responseString)\")\n            }\n        }\n        return (data, urlResponse)\n    }\n}\n\n// Add response interceptor to network service\nEagleNet.addResponseInterceptor(LoggingInterceptor())\n```\n\n### Custom HTTP Methods\n\n```swift\n// Using custom HTTP methods like PATCH\nstruct UpdateStatus: Encodable {\n    let status: String\n}\n\nlet patchRequest = DataRequest(\n    url: \"https://api.example.com/users/1\",\n    httpMethod: .custom(\"PATCH\"),\n    body: UpdateStatus(status: \"active\")\n)\n\nlet response: User = try await EagleNet.execute(patchRequest)\n```\n\n### Configuration\n\n```swift\n// Custom URLSession configuration\nlet customService = EagleNet.defaultService(\n    urlSession: URLSession(configuration: .ephemeral),\n    jsonEncoder: JSONEncoder(),\n    jsonDecoder: JSONDecoder()\n)\n\nEagleNet.configure(networkService: customService)\n```\n\n## Author\n\n[Anbalagan D](mailto:anbu94p@gmail.com)\n\n## License\n\nEagleNet is available under the MIT license. See the [LICENSE](LICENSE) file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanbalagand%2Feaglenet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanbalagand%2Feaglenet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanbalagand%2Feaglenet/lists"}