简易网络

此类专为简单的网络任务而设计。

要求

安装

使用 Swift Package Manager 安装

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

并导入它

import SimpleNetworking

用法

声明网络变量 (推荐)

import SimpleNetworking

let networking = SimpleNetworking.shared

我们使用 networking 作为变量名,但您可以使用任何您喜欢的名称。请注意,在下面的示例中,我们使用 networking 作为变量名。如果您使用不同的名称,请将 networking 替换为您自己的变量名。 或者使用 SimpleNetworking.shared 代替 networking

设置 (可选)

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

设置 User-Agent (可选)

networking.set(userAgent: "STRING")

设置身份验证 (可选)

networking.set(authorization: "STRING")

设置 POST 类型 (可选)

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

GET 数据 Async/Await

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

    print(response.string)
}

POST 数据 Async/Await

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

    print(response.string)
}

GET 数据 (基于闭包)

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

POST 数据 (基于闭包)

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

networkResponse

通过 networkResponse,您可以获得以下数据

奖励 1: JSON 解码

Codable, 解码策略 = useDefaultKeys

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

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

Codable, 解码策略 = convertFromSnakeCase

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

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

奖励: Websocket

import SimpleNetworking

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

添加 HTTP Cookie

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

networking.add(cookie: cookie)

添加 HTTP Header

networking.add(header: .init(name: "my header", value: "my value"))

// Or if you want to declare it first
let header = SimpleNetworking.HTTPHeader(name: "my header", value: "my value")

networking.add(header: header)

模拟 (Mocking)

SimpleNetworking 可以被模拟 (自 1.0.3 版本起),因此您可以在不实际发出网络请求的情况下测试您的代码。

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

调试

/// 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

联系方式

🦋 @0xWDG 🐘 mastodon.social/@0xWDG 🐦 @0xWDG 🧵 @0xWDG 🌐 wesleydegroot.nl 🤖 Discord

有兴趣了解更多关于 Swift 的信息吗? 查看我的博客