DEV Community

Wesley de Groot
Wesley de Groot

Posted on • Originally published at wesleydegroot.nl on

SimpleNetworking

Today i write about my Swift package SimpleNetworking.
It's a simple networking library for Swift it is a wrapper around URLSession and provides a variety of functions to make easy network requests.
You can find the source code and documentation at GitHub https://github.com/0xWDG/SimpleNetworking.

Installation

Install using Swift Package Manager

dependencies: [.package(url: "https://github.com/0xWDG/SimpleNetworking.git", .branch("main")),], targets: [.target(name: "MyTarget", dependencies: [ .product(name: "SimpleNetworking", package: "SimpleNetworking"),]), ]

Async / Await Examples

import SimpleNetworking class myApiService { // Create a shared instance of SimpleNetworking let networking = SimpleNetworking.shared init() { // Set base URL (optional) networking.set(serverURL: "https://wesleydegroot.nl") // Set a custom user agent (optional) networking.set(userAgent: "My App") // Set a custom authorization header (optional) networking.set(authorization: "MyToken") // Set a custom post type (optional) networking.set(postType: .json) // .plain, .json, .graphQL } /// Get a user (GET request) func getUser() async { let response = await networking.request( path: "/api/getUser", method: .get ) print(response.string) } /// Update a user (POST request) func updateUser() async { let response = await networking.request( path: "/api/updateUser", method: .post(["firstname": "Wesley", "lastname": "de Groot"]) ) print(response.string) } /// Get all users (GET request) func getUsers() async { let response = await networking.request( path: "/api/getUsers", method: .get ) struct userProfile: Codable { let firstname: String let lastname: String } // Decode the response let userProfiles: [userProfile]? = networkResponse.decoded() print(userProfiles) } }

Closure Examples

Closure Examples
import SimpleNetworking class myApiService { // Create a shared instance of SimpleNetworking let networking = SimpleNetworking.shared init() { // Set base URL (optional) networking.set(serverURL: "https://wesleydegroot.nl") // Set a custom user agent (optional) networking.set(userAgent: "My App") // Set a custom authorization header (optional) networking.set(authorization: "MyToken") // Set a custom post type (optional) networking.set(postType: .json) // .plain, .json, .graphQL } /// Get a user (GET request) func getUser() { networking.request( path: "/api/getUser", method: .get ) { response in print(response.string) } } /// Update a user (POST request) func updateUser() async { networking.request( path: "/api/updateUser", method: .post(["firstname": "Wesley", "lastname": "de Groot"]) ) { response in print(response.string) } } /// Get all users (GET request) func getUsers() async { networking.request( path: "/api/getUsers", method: .get ) { response in struct userProfile: Codable { let firstname: String let lastname: String } // Decode the response let userProfiles: [userProfile]? = networkResponse.decoded() print(userProfiles) } } }

Debugging

Enable Debugging
import SimpleNetworking /// Debug: print NSURLRequest (Default: false) SimpleNetworking.shared.debug.requestURL = true /// Debug: print sent HTTP Headers (Default: false) SimpleNetworking.shared.debug.requestHeaders = true /// Debug: print sent Cookies (Default: false) SimpleNetworking.shared.debug.requestCookies = true /// Debug: print sent Body (Default: false) SimpleNetworking.shared.debug.requestBody = true /// Debug: print received HTTP Headers (Default: false) SimpleNetworking.shared.debug.responseHeaders = true /// Debug: print received Body (Default: false) SimpleNetworking.shared.debug.responseBody = true /// Debug: print received JSON (if any) (Default: false) SimpleNetworking.shared.debug.responseJSON = true
Example debug output (GET request)
Request: GET https://wesleydegroot.nl/ Headers: Content-Type: application/json User-Agent: Simple Networking (https://github.com/0xWDG/SimpleNetworking) Cookies: Body: HTTPURLResponse: HTTP 200 Cache-Control: max-age=60, private, proxy-revalidate Content-Encoding: gzip Server: Apache/2 Content-Type: text/html; charset=UTF-8 Vary: Accept-Encoding,User-Agent Date: Mon, 26 Feb 2024 19:50:42 GMT Body: ... HTTP BODY ... Decoded JSON: Unable to parse JSON
Example debug output (POST request)
Request: POST https://wesleydegroot.nl/api/userUpdate Headers: User-Agent: Simple Networking (https://github.com/0xWDG/SimpleNetworking) Content-Type: application/json Cookies: Body: {"age":33,"firstname":"Wesley","lastname":"de Groot"} HTTPURLResponse: HTTP 200 Content-Encoding: gzip Content-Type: text/html; charset=UTF-8 Vary: Accept-Encoding,User-Agent Cache-Control: max-age=60, private, proxy-revalidate Server: Apache/2 Date: Mon, 26 Feb 2024 19:52:58 GMT Body: {"status":"user updated","code":200} Decoded JSON: ["status": user updated, "code": 200]

Wrap up

SimpleNetworking is a simple networking library for Swift it is a wrapper around URLSession and provides a variety of functions to make easy network requests.
You can find the source code and documentation at GitHub https://github.com/0xWDG/SimpleNetworking.

If you have any questions or suggestions, feel free to contact me on Twitter/X or comment below this post.

Sentry mobile image

App store rankings love fast apps - mobile vitals can help you get there

Slow startup times, UI hangs, and frozen frames frustrate users—but they’re also fixable. Mobile Vitals help you measure and understand these performance issues so you can optimize your app’s speed and responsiveness. Learn how to use them to reduce friction and improve user experience.

Read full post →

Top comments (0)

Billboard image

📊 A side-by-side product comparison between Sentry and Crashlytics

A free guide pointing out the differences between Sentry and Crashlytics, that’s it. See which is best for your mobile crash reporting needs.

See Comparison

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay