SimpleNetworking

1.0.7

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.
0xWDG/SimpleNetworking

What's New

Linux Support

2024-05-29T12:44:58Z

What's Changed

  • Feat/automatic post type detection by @0xWDG in #3
  • Add more types as options for HTTP Requests by @0xWDG in #4
  • Linux Support by @0xWDG in #6

Full Changelog: 1.0.6...1.0.7

Simple networking

This class is meant for simple network tasks.

Requirements

  • Swift 5.9+ (Xcode 15+)
  • iOS 13+, macOS 10.15+, tvOS, watchOS, Linux

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"),
    ]),
]

And import it:

import SimpleNetworking

Usage

Declare networking variable (preferred)

import SimpleNetworking

let networking = SimpleNetworking.shared

We use networking as the variable name, but you can use any name you like. Please note in the examples below we use networking as the variable name. If you use a different name, please replace networking with your variable name. Or use SimpleNetworking.shared instead of networking.

Setup (optional)

networking.set(serverURL: "https://wesleydegroot.nl")

Set user-agent (optional)

networking.set(userAgent: "STRING")

Set authentication (optional)

networking.set(authorization: "STRING")

Set post type (optional)

networking.set(postType: .json) // .plain, .json, .graphQL

GET data Async/Await

Task {
    let response = await networking.request(
        path: "/",
        method: .get
    )

    print(response.string)
}

POST data Async/Await

Task {
    let response = await networking.request(
        path: "/",
        method: .post(
            [
                "postfield1": "poststring1",
                "postfield2": "poststring2"
            ]
        )
    )

    print(response.string)
}

GET data (closure based)

networking.request(
    path: "/",
    method: .get
) { networkResponse in
    print(networkResponse)
}

POST data (closure based)

networking.request(
    path: "/",
    method: .post(
        [
            "postfield1": "poststring1",
            "postfield2": "poststring2"
        ]
    )
) { networkResponse in
    print(networkResponse)
}

Bonus 1: JSON Decoding

Codable, decoding strategy = useDefaultKeys

struct MyCodable: Codable {
    let value1: String
    let value2: String
}

// Decode the response
let data: MyCodable? = networkResponse.decoded()

Codable, decoding strategy = convertFromSnakeCase

struct MyCodable: Codable {
    let snakeCase: String
    let caseSnake: String
}

// Decode the response
let data: MyCodable? = networkResponse.decoded(.convertFromSnakeCase)

Bonus: Websocket

import SimpleNetworking

networking.connect(to: "https://api.github.com/users/0xWDG") { data in
    print(data)
}

Add HTTP Cookie

let cookie = HTTPCookie.init(properties: [
    .name: "my cookie",
    .value: "my value",
    .domain: "wesleydegroot.nl"
    .path: "/"
])

networking.add(cookie: cookie)

Mocking

SimpleNetworking can be mocked (since version 1.0.3), so you can test your code without actually making a network request.

networking.set(mockData: [
    "https://wesleydegroot.nl": .init(
        data: "OVERRIDE", // Can be Data or String
        response: .init( // NSURLResponse, Can be nil
            url: .init(string: "https://wesleydegroot.nl")!,
            mimeType: "text/html",
            expectedContentLength: 8,
            textEncodingName: "utf-8"
        ),
        statusCode: 200, // Int: If omitted, 200 is used
        error: nil
    ),
    "/only/an/path": .init(
        data: "OVERRIDE", // Can be Data or String
        response: .init( // NSURLResponse, Can be nil
            url: .init(string: "https://wesleydegroot.nl/only/an/path")!,
            mimeType: "text/html",
            expectedContentLength: 8,
            textEncodingName: "utf-8"
        ),
        statusCode: 200, // Int: If omitted, 200 is used
        error: nil
    )
])

Debugging

/// Debug: NSURLRequest
networking.debug.requestURL = false

/// Debug: sent HTTP Headers
networking.debug.requestHeaders = false

/// Debug: sent Cookies
networking.debug.requestCookies = false

/// Debug: sent Body
networking.debug.requestBody = false

/// Debug: received HTTP Headers
networking.debug.responseHeaders = false

/// Debug: received Body
networking.debug.responseBody = false

/// Debug: received JSON (if any)
networking.debug.responseJSON = false

Contact

We can get in touch via Twitter/X, Discord, Mastodon, Threads, Bluesky.

Alternatively you can visit my Website.

Description

  • Swift Tools 5.9.0
View More Packages from this Author

Dependencies

  • None
Last updated: Wed Nov 13 2024 03:26:57 GMT-1000 (Hawaii-Aleutian Standard Time)