{"id":15707295,"url":"https://github.com/0xwdg/simplenetworking","last_synced_at":"2025-05-12T19:44:34.865Z","repository":{"id":222373565,"uuid":"756943666","full_name":"0xWDG/SimpleNetworking","owner":"0xWDG","description":"Simple networking is a Swift library for handling network requests. It is built on top of URLSession and provides a simple and easy-to-use interface for making network requests. the key features of SimpleNetworking are simple, mockable, reliable.","archived":false,"fork":false,"pushed_at":"2025-02-20T20:19:41.000Z","size":447,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-14T05:38:59.091Z","etag":null,"topics":["0xwdg","easy","framework","hacktoberfest","networking","simple","simple-networking","simplenetworking","spm","swift","swiftlang"],"latest_commit_sha":null,"homepage":"https://0xwdg.github.io/SimpleNetworking/","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/0xWDG.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"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},"funding":{"github":"0xWDG"}},"created_at":"2024-02-13T15:57:21.000Z","updated_at":"2025-02-26T15:30:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"c823e6dc-0a18-4bac-9a2a-27c6eb5d94be","html_url":"https://github.com/0xWDG/SimpleNetworking","commit_stats":{"total_commits":62,"total_committers":1,"mean_commits":62.0,"dds":0.0,"last_synced_commit":"f336b126e6557dcd71387e7443ba1267d2a0198b"},"previous_names":["0xwdg/simplenetworking"],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xWDG%2FSimpleNetworking","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xWDG%2FSimpleNetworking/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xWDG%2FSimpleNetworking/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xWDG%2FSimpleNetworking/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0xWDG","download_url":"https://codeload.github.com/0xWDG/SimpleNetworking/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253809776,"owners_count":21967795,"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":["0xwdg","easy","framework","hacktoberfest","networking","simple","simple-networking","simplenetworking","spm","swift","swiftlang"],"created_at":"2024-10-03T20:39:30.558Z","updated_at":"2025-05-12T19:44:34.842Z","avatar_url":"https://github.com/0xWDG.png","language":"Swift","funding_links":["https://github.com/sponsors/0xWDG"],"categories":[],"sub_categories":[],"readme":"# Simple Networking\n\nThis class is meant for simple network tasks.\n\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2F0xWDG%2FSimpleNetworking%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/0xWDG/SimpleNetworking) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2F0xWDG%2FSimpleNetworking%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/0xWDG/SimpleNetworking)\n\n## Requirements\n\n- Swift 5.9+ (Xcode 15+)\n- iOS 13+, macOS 10.15+, tvOS, watchOS, Linux\n\n## Installation\n\nInstall using Swift Package Manager\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/0xWDG/SimpleNetworking.git\", branch: \"main\"),\n],\ntargets: [\n    .target(name: \"MyTarget\", dependencies: [\n        .product(name: \"SimpleNetworking\", package: \"SimpleNetworking\"),\n    ]),\n]\n```\n\nAnd import it:\n\n```swift\nimport SimpleNetworking\n```\n\n## Usage\n\n### Declare networking variable (preferred)\n\n```swift\nimport SimpleNetworking\n\nlet networking = SimpleNetworking.shared\n```\n\nWe use `networking` as the variable name, but you can use any name you like.\nPlease note in the examples below we use `networking` as the variable name.\nIf you use a different name, please replace `networking` with your variable name.\nOr use `SimpleNetworking.shared` instead of `networking`.\n\n### Setup (optional)\n\n```swift\nnetworking.set(serverURL: \"https://wesleydegroot.nl\")\n```\n\n### Set user-agent (optional)\n\n```swift\nnetworking.set(userAgent: \"STRING\")\n```\n\n### Set authentication (optional)\n\n```swift\nnetworking.set(authorization: \"STRING\")\n```\n\n### Set post type (optional)\n\n```swift\nnetworking.set(postType: .json) // .plain, .json, .graphQL\n```\n\n### GET data Async/Await\n\n```swift\nTask {\n    let response = await networking.request(\n        path: \"/\",\n        method: .get\n    )\n\n    print(response.string)\n}\n```\n\n### POST data Async/Await\n\n```swift\nTask {\n    let response = await networking.request(\n        path: \"/\",\n        method: .post(\n            [\n                \"postfield1\": \"poststring1\",\n                \"postfield2\": \"poststring2\"\n            ]\n        )\n    )\n\n    print(response.string)\n}\n```\n\n### GET data (closure based)\n\n```swift\nnetworking.request(\n    path: \"/\",\n    method: .get\n) { networkResponse in\n    print(networkResponse)\n}\n```\n\n### POST data (closure based)\n\n```swift\nnetworking.request(\n    path: \"/\",\n    method: .post(\n        [\n            \"postfield1\": \"poststring1\",\n            \"postfield2\": \"poststring2\"\n        ]\n    )\n) { networkResponse in\n    print(networkResponse)\n}\n```\n\n### networkResponse\n\nWith networkResponse you can get the following data:\n- [response](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/response): URLResponse? // URLResponse\n- [statuscode](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/statuscode): Int // HTTP status code\n- [error](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/error): Error? // Error\n- [data](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/data): Data? // Received data\n- [string](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/string): String? // Received data as string\n- [dictionary](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/dictionary): [String: Any]? // Received data as dictionary (only works if data is JSON)\n- [cookies](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/cookies): [HTTPCookie]? // Received cookies\n- [request](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/request): URLRequest? // Sent request\n- [headers](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/headers): [HTTPHeader] // Received headers\n- \u003ca href='https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/decoded(strategy:file:line:function:)'\u003edecoded\u003c/a\u003e -\u003e T? // Decoded data\n- [cURL](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/cURL): String // as cURL command\n- [asHTTPRequest](https://0xwdg.github.io/SimpleNetworking/documentation/simplenetworking/simplenetworking/networkresponse/asHTTPRequest): String // as HTTP Request\n\n### Bonus 1: JSON Decoding\n\n#### Codable, decoding strategy = useDefaultKeys\n\n```swift\nstruct MyCodable: Codable {\n    let value1: String\n    let value2: String\n}\n\n// Decode the response\nlet data: MyCodable? = networkResponse.decoded()\n```\n\n#### Codable, decoding strategy = convertFromSnakeCase\n\n```swift\nstruct MyCodable: Codable {\n    let snakeCase: String\n    let caseSnake: String\n}\n\n// Decode the response\nlet data: MyCodable? = networkResponse.decoded(.convertFromSnakeCase)\n```\n\n### Bonus: Websocket\n\n```swift\nimport SimpleNetworking\n\nnetworking.connect(to: \"https://api.github.com/users/0xWDG\") { data in\n    print(data)\n}\n```\n\n### Add HTTP Cookie\n\n```swift\nlet cookie = HTTPCookie.init(properties: [\n    .name: \"my cookie\",\n    .value: \"my value\",\n    .domain: \"wesleydegroot.nl\"\n    .path: \"/\"\n])\n\nnetworking.add(cookie: cookie)\n```\n\n### Add HTTP Header\n\n```swift\nnetworking.add(header: .init(name: \"my header\", value: \"my value\"))\n\n// Or if you want to declare it first\nlet header = SimpleNetworking.HTTPHeader(name: \"my header\", value: \"my value\")\n\nnetworking.add(header: header)\n```\n\n### Mocking\n\nSimpleNetworking can be mocked (since version 1.0.3), so you can test your code without actually making a network request.\n\n```swift\n\nnetworking.set(mockData: [\n    \"https://wesleydegroot.nl\": .init(\n        data: \"OVERRIDE\", // Can be Data or String\n        response: .init( // NSURLResponse, Can be nil\n            url: .init(string: \"https://wesleydegroot.nl\")!,\n            mimeType: \"text/html\",\n            expectedContentLength: 8,\n            textEncodingName: \"utf-8\"\n        ),\n        statusCode: 200, // Int: If omitted, 200 is used\n        error: nil\n    ),\n    \"/only/an/path\": .init(\n        data: \"OVERRIDE\", // Can be Data or String\n        response: .init( // NSURLResponse, Can be nil\n            url: .init(string: \"https://wesleydegroot.nl/only/an/path\")!,\n            mimeType: \"text/html\",\n            expectedContentLength: 8,\n            textEncodingName: \"utf-8\"\n        ),\n        statusCode: 200, // Int: If omitted, 200 is used\n        error: nil\n    )\n])\n```\n\n### Debugging\n\n```swift\n\n/// Debug: NSURLRequest\nnetworking.debug.requestURL = false\n\n/// Debug: sent HTTP Headers\nnetworking.debug.requestHeaders = false\n\n/// Debug: sent Cookies\nnetworking.debug.requestCookies = false\n\n/// Debug: sent Body\nnetworking.debug.requestBody = false\n\n/// Debug: received HTTP Headers\nnetworking.debug.responseHeaders = false\n\n/// Debug: received Body\nnetworking.debug.responseBody = false\n\n/// Debug: received JSON (if any)\nnetworking.debug.responseJSON = false\n```\n\n## Contact\n\n🦋 [@0xWDG](https://bsky.app/profile/0xWDG.bsky.social)\n🐘 [mastodon.social/@0xWDG](https://mastodon.social/@0xWDG)\n🐦 [@0xWDG](https://x.com/0xWDG)\n🧵 [@0xWDG](https://www.threads.net/@0xWDG)\n🌐 [wesleydegroot.nl](https://wesleydegroot.nl)\n🤖 [Discord](https://discordapp.com/users/918438083861573692)\n\nInterested learning more about Swift? [Check out my blog](https://wesleydegroot.nl/blog/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xwdg%2Fsimplenetworking","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0xwdg%2Fsimplenetworking","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xwdg%2Fsimplenetworking/lists"}