Lightweight REST and JSON library for Swift.

Overview

RestEssentials is an extremely lightweight REST and JSON library for Swift and can be used on iOS, iPadOS, macOS, tvOS, and watchOS.

Features

  • Easily perform asynchronous REST networking calls (GET, POST, PUT, PATCH, or DELETE) that send JSON
  • Natively integrates with Swift's Decodable and Encodable types
  • Supports JSON, Void, UIImage, and Data resposne types
  • Full JSON parsing capabilities
  • HTTP response validation
  • Send custom HTTP headers
  • Accept self-signed SSL certificates
  • Change timeout options
  • Response type handling can be extended via new Protocol implementation
  • Fully native Swift API

Requirements

RestEssentials works with any of the supported operating systems listed below with the version of Xcode.

  • iOS 11.0+
  • tvOS 11.0+
  • watchOS 4.0+
  • iPadOS 11.0+
  • macOS 10.13+

Swift Version Compatibility

RestEssentials is ONLY compatible with Swift 5 and above. See below for a list of recommended versions for your version of Swift:

  • Swift 5 -> RestEssentials 5.2.0 (or 4.0.3+ -- macOS and SPM support added in 5.0.1)
  • Swift 4 -> RestEssentials 4.0.2
  • Swift 3 -> RestEssentials 3.1.0
  • Swift 2.3 -> Not Supported
  • Swift 2.0-2.2 -> RestEssentials 2.0.0
  • Swift 1 -> RestEssentials 1.0.2

Communication

  • If you need help, use Stack Overflow. (Tag 'restessentials')
  • If you'd like to ask a general question, use Stack Overflow.
  • If you found a bug, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.

Installation

Swift Package Manager

RestEssentials is compatible with the SPM for macOS, iOS, iPadOS, tvOS, and watchOS (not avaiale on Linux at this time). When using XCode 11, the Swift Package Manager is the recommended installation method.

To use in XCode 11, open your project and go to File->Swift Packages->Add Package Dependency... and follow along the dialogs. Thats it!

If you prefer to add it manually using SPM, just add the RestEssentials dependency to your target in your Package.swift file.

dependencies: [
.package(url: "https://github.com/sean7512/RestEssentials.git", from: "5.2.0")
]

CocoaPods

CocoaPods is a dependency manager for Cocoa projects and is the preferred method of installation.

Install the latest version of CocoaPods with the following command:

$ sudo gem install cocoapods

To integrate RestEssentials into your Xcode project using CocoaPods, specify it in your Podfile:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.0'
use_frameworks!

target 'MyApp' do
pod 'RestEssentials', '~> 5.2.0'
end

Then, run the following command:

$ pod install

Manually

If you prefer not to use CocoaPods, you can integrate RestEssentials into your project manually.

Embedded Framework

  • Add RestEssentials as a submodule by opening the Terminal, cd-ing into your top-level project directory, and entering the following command:
$ git submodule add https://github.com/sean7512/RestEssentials.git
  • Open the new RestEssentials folder, and drag the RestEssentials.xcodeproj into the Project Navigator of your application's Xcode project.

    It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.

  • Select the RestEssentials.xcodeproj in the Project Navigator and verify the deployment target matches that of your application target.

  • And that's it!

The RestEssentials.framework is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.

Source File

If you prefer to rock it old-school, RestEssentials can be integrated by adding all the Swift files located inside the Source directory (Source/*.swift) directly into your project. Note that you will no longer need to import RestEssentials since you are not actually loading a framework.


Usage

RestEssentials is best used with Swift 4's native JSON support (using the Codable/Encodabe/Decodable protocols). RestEssentials can be used with the built-in JSON parsing and support if your code doesn't use the new Codable protocol.

The use of the built-in JSON object in RestEssentials and Swift 4's Codable are interchangeable (you can post JSON and expect a Codable object back or you can post a Codable object and get any response type back).

Making a GET Request and getting back a Swift 4 Codable object

import RestEssentials

struct HttpBinResponse: Codable {
    let url: String
}

guard let rest = RestController.make(urlString: "http://httpbin.org/get") else {
    print("Bad URL")
    return
}

rest.get(HttpBinResponse.self) { result, httpResponse in
    do {
        let response = try result.value() // response is of type HttpBinResponse
        print(response.url) // "http://httpbin.org/get"
    } catch {
        print("Error performing GET: \(error)")
    }
}

Making a POST Request using a Swift 4 Codable object and getting back a Swift 4 Codable object

import RestEssentials

// httpbin returns json with the url and the posted data under a key called "json"
struct HttpBinResponse: Codable {
    let url: String
    let json: Car
}

struct Car: Codable {
    let make: String
    let model: String
    let year: Int
}

guard let rest = RestController.make(urlString: "http://httpbin.org") else {
    print("Bad URL")
    return
}

let myCar = Car(make: "Jeep", model: "Grand Cherokee", year: 2017)
rest.post(myCar, at: "post", responseType: HttpBinResponse.self) { result, httpResponse in
    do {
        let response = try result.value() // response is of type HttpBinResponse
        let car = response.json // car is of type Car
    } catch {
        print("Error performing GET: \(error)")
    }
}

Making a GET Request and parsing the response as raw JSON (not using Swift 4's Codable)

import RestEssentials

guard let rest = RestController.make(urlString: "http://httpbin.org/get") else {
    print("Bad URL")
    return
}

rest.get(withDeserializer: JSONDeserializer()) { result, httpResponse in
    do {
        let json = try result.value()
        print(json["url"].string) // "http://httpbin.org/get"
    } catch {
        print("Error performing GET: \(error)")
    }
}

Making a POST Request and parsing the response (not using Swift 4's Codable)

import RestEssentials

guard let rest = RestController.make(urlString: "http://httpbin.org") else {
    print("Bad URL")
    return
}

let postData: JSON = ["key1": "value1", "key2": 2, "key3": 4.5, "key4": true, "key5": [1, 2, 3, 4]]
rest.post(postData, at: "post") { result, httpResponse in
    do {
        let json = try result.value()
        print(json["url"].string) // "http://httpbin.org/post"
        print(json["json"]["key1"].string) // "value1"
        print(json["json"]["key2"].int) // 2
        print(json["json"]["key3"].double) // 4.5
        print(json["json"]["key4"].bool) // true
        print(json["json"]["key5"][2].numerical) // 3
        print(json["json"]["key6"].string) // nil
    } catch {
        print("Error performing POST: \(error)")
    }
}

Making a PUT Request and parsing the response (not using Swift 4's Codable)

import RestEssentials

guard let rest = RestController.make(urlString: "http://httpbin.org/put") else {
    print("Bad URL")
    return
}

let putData: JSON = ["key1": "value1", "key2": 2, "key3": 4.5, "key4": true]
rest.put(putData) { result, httpResponse in
    do {
        let json = try result.value()
        print(json["url"].string) // "http://httpbin.org/put"
    } catch {
        print("Error performing PUT: \(error)")
    }
}

Making a GET Request for an image

import RestEssentials

guard let rest = RestController.make(urlString: "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png") else {
    print("Bad URL")
    return
}

rest.get(withDeserializer: ImageDeserializer()) { result, httpResponse in
    do {
        let img = try result.value()
        let isImage = img is UIImage // true
    } catch {
        print("Error performing GET: \(error)")
    }
}

Error Handling

When attempting to retrieve the result value (try result.value()), any errors that occurred will be thrown here. The errors may be one of the built-in NetworkingError types or they may be ones from Foundation. The built in error definitions are below for your convenience.

/// Errors related to the networking for the `RestController`
public enum NetworkingError: Error {
    /// Indicates the server responded with an unexpected status code.
    /// - parameter Int: The status code the server respodned with.
    /// - parameter Data?: The raw returned data from the server
    case unexpectedStatusCode(Int, Data?)

    /// Indicates that the server responded using an unknown protocol.
    /// - parameter Data?: The raw returned data from the server
    case badResponse(Data?)

    /// Indicates the server's response could not be deserialized using the given Deserializer.
    /// - parameter Data: The raw returned data from the server
    /// - parameter Error?: The original system error (like a DecodingError, etc) that caused the malformedResponse to trigger
    case malformedResponse(Data, Error?)

    /// Inidcates the server did not respond to the request.
    case noResponse
}

DecodingError errors will be caught and wrapped as a NetworkingError.malformedResponse(Data, Error?). For more enformating on these errors, see https://developer.apple.com/documentation/swift/encodingerror and https://developer.apple.com/documentation/swift/decodingerror

Other Notes

If the web service you're calling doesn't return any JSON (or you don't need to capture it), then use the VoidDeserializer. If you want to return a different data type other than a Decodable, JSON, Data, or UIImage; create a new implementation of Deserializer and use that.

The callbacks are NOT guranteed to be on the main thread (or the calling thread), JSON parsing should happen in the callback and then passed back to the main thread as needed (after parsing).

There is an alternative static function to instantiate a RestController object: make:URL This variation does not return an Optional like the String version. This is useful for easily constructing your URL with query parameters (typically for a GET request).

A RestController has a headerGenerator field that is a closure callback that will be made for every call to generatoe headers. This simplifies the process of sending the same header on every request, as a RestOptions object does not need to be created for each request.

All of the operations can take an optional RestOptions object, which allow you to configure the expected HTTP status code, optional HTTP headers to include in the request, and the timeout on the request in seconds.

All of the operations can also take a relative path to be used. If your RestController object is for http://foo.com you can pass in some/relative/path, then the request will go to http://foo.com/some/relative/path. This enables you to use a single RestController object for all REST calls to the same host. This IS the preferred behavior isntead of creating a new RestController for every call.

You can optionally allow the framework to accept a self-signed SSL certificate from the host using the acceptSelfSignedCertificate property on the RestController instance. You must properly configure App Transport Security.

FAQ

When should I use RestEssentials?

If you're starting a new project in Swift, and want to take full advantage of its conventions and language features, RestEssentials is a great choice. Although not as fully-featured as Alamofire, AFNetworking, or RestKit, it should satisfy your basic REST needs. If you only need to perform standard networking options (GET, PUT, POST, DELETE), accept self-signed SSL certificates, send HTTP headers, and you are only ever dealing with JSON as input (and any data type as the output), then RestEssentials is the perfect choice!

It's important to note that two libraries aren't mutually exclusive: RestEssentials can live in the same project as any other networking library.

When should I use Alamofire?

Alamofire is a more fully featured networking library and is also written in Swift. It adds support for multi-part file uploads and the ability to configure your own URLSessionConfiguration (which most probably won't need to do).

When should I use AFNetworking?

AFNetworking remains the premiere networking library available for OS X and iOS, and can easily be used in Swift, just like any other Objective-C code. AFNetworking is stable and reliable, and isn't going anywhere.

Use AFNetworking for any of the following:

  • UIKit extensions, such as asynchronously loading images to UIImageView
  • Network reachability monitoring, using AFNetworkReachabilityManager

When should I use RestKit?

RestKit is a very advanced library that is build ontop of AFNetworking and offers very advanced features such as automatic JSON mapping to classes. RestKit is also an Objective-C library, but it is easily usable in your Swift projects.


Credits

RestEssentials is owned and maintained by Sean K.

License

RestEssentials is released under the MIT license. See LICENSE for details.

Comments
  • Better exception message when throwing MalformedResponse

    Better exception message when throwing MalformedResponse

    It is very hard to find where is the malformed part of a response when dealing with a big JSON. Would be nice if a more specific message was shown, like "Could not find "key" in the JSON".

    And also, I couldn't find a way to get the raw text response and print it to help me debug.

    Thanks for the library. I really wish I could be of more help, but I'm learning Swift.

    enhancement 
    opened by vitorhugods 11
  • Access error message

    Access error message

    When I receive an error from my server, I also receive an error message in the response body as a string, but I'm not able to get it... Is there any way to access it? I'm calling the service like this:

    var restOptions = RestOptions() restOptions.expectedStatusCode = 200

    rest.get([BundleVersionsResponse].self, options: restOptions) { result, httpResponse in
        do {
            let response = try result.value()
            print(response.count)
        }
        catch {
            print("Error performing GET: \(error)")
        }
    }
    
    opened by vipatronon 10
  • Error performing POST: Error Domain=NSCocoaErrorDomain Code=3840

    Error performing POST: Error Domain=NSCocoaErrorDomain Code=3840

    Hi Sean, First of all, thanks for your work.

    I'm trying to make a POST request but I'm struggling ..

    Using Postman, this is what I need to request : capture d ecran 2018-08-09 a 13 35 31

    So this is the code I'm using, based on your example :

    let postData2: JSON = ["emailAddress": "emailAddress", "password": "password"]
    
    rest.post(postData2, at: "user") { result, httpResponse  in
            do {
                let json = try result.value()
                print(json)
           } catch {
                print("Error performing POST: \(error)")
           }
    }
    

    And when I'm trying to execute I'm getting this error :

    Error performing POST: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start 
    with array or object and option to allow fragments not set." 
    UserInfo={NSDebugDescription=JSON text did not start with array or object and option 
    to allow fragments not set.}
    

    I hope that you can help me to understand my mistake.

    Thanks in advance, Etienne.

    opened by Etio39 5
  • 'raw' is inaccessible due to 'private' protection level in JSON.swift

    'raw' is inaccessible due to 'private' protection level in JSON.swift

    When trying to build a project including RestEssentials, I receive the following error in JSON.swift:

    'raw' is inaccessible due to 'private' protection level

    The makeData() function inside of the internal extension for the JSON struct is trying to access a private variable 'raw'. If the variable is changed to be fileprivate instead, it compiles successfully. Do you believe anything else needs to be changed to address this?

    Thanks

    duplicate 
    opened by mabdullah2010 5
  • query string

    query string "?" passed in via "at:" parameter is encoded to "%3F"

    Hi, I been experiencing issue when trying to use the get function in the RestController to retrieve a list. The "at:" parameter when passed in with query string, will auto encode the "?" to "%3F" and cause my spring framework server to read the entire query string as part of the URL path literal instead.

    Below is my code snippet of my calls: rest.get(withDeserializer: JSONDeserializer(), at: "/list?page=0&size=10&sort=name,asc", options: header, callback: {result, response in print("\(result)\n\n\(response)"})

    the url that was called (copied from response print) as: http://localhost:8095/itam/api/asset/list%3Fpage=0&size=10&sort=name,asc

    I have tested the server call to be working using the "?" instead of "%3F" via postman chrome extension.

    Is it possible not to encode the "?" or provide a query string parameter so that the query string doesn't get encoded?

    enhancement 
    opened by ohgasauraus 4
  • Make RestEssentials compatible with OSX

    Make RestEssentials compatible with OSX

    I was looking for a true simple cross-platform Rest library when I came across RestEssentials. It is good on iOS, WatchOS and TvOS, but not for OSX.

    Looking at the code, I realized you can simply put a IFDEF around the class

    /// A Deserializer for UIImage public class ImageDeserializer: Deserializer {

    to use NSImage instead of UIImage, and import AppKit instead of UIKit, in order to make it truly universal on all Apple OSs.

    I tested the change on MacOS, and it worked great.

    Do you have any plans to make a quick update to make this official?

    Thanks a lot.

    opened by H1p3ri0n 3
  • Can't disable the on finish console logging

    Can't disable the on finish console logging

    I see the 'req.skipRequestLog' flag in the request-logger.js file. If this were changed to 'options.skipRequestLog' then the console output could be silenced when the object is instantiated.

    opened by hanssl 3
  • [XC9][Warning] Main Thread Checker warning

    [XC9][Warning] Main Thread Checker warning

    Since XC9 released I've been seeing this issue being printed on my debug console:

    Main Thread Checker: UI API called on a background thread: -[UIApplication setNetworkActivityIndicatorVisible:]

    After searching, I was unable to find a single instance of >setNetworkActivityIndicatorVisible

    I'm just reporting this for reporting's sake. It's a warning and should be prioritized as such, but I think it's worth pointing it out. Me, personally, would consider it low priority if some other more critical issues show up, but given the nature of the warning itself (UI stuff on non-main threads), I'd still advice to address it as quickly as possible.

    The debug stack is like this:

    =================================================================
    Main Thread Checker: UI API called on a background thread: -[UIApplication setNetworkActivityIndicatorVisible:]
    PID: 42219, TID: 2024360, Thread name: (none), Queue name: NSOperationQueue 0x600000224020 (QOS: UNSPECIFIED), QoS: 0
    Backtrace:
    4   RestEssentials                      0x000000010abbd001 _T014RestEssentials0A10ControllerC8dataTask33_91282727334FD93F32E0C59020D3A2CELLySSSg12relativePath_SS10httpMethodSS6acceptAA4JSONVSg4jsonAA0A7OptionsV7optionsyAA6ResultOy10Foundation4DataVG_So15HTTPURLResponseCSgtc8callbacktKFyAUSg_So11URLResponseCSgs5Error_pSgtcfU_ + 289
    5   RestEssentials                      0x000000010abc28e8 _T014RestEssentials0A10ControllerC8dataTask33_91282727334FD93F32E0C59020D3A2CELLySSSg12relativePath_SS10httpMethodSS6acceptAA4JSONVSg4jsonAA0A7OptionsV7optionsyAA6ResultOy10Foundation4DataVG_So15HTTPURLResponseCSgtc8callbacktKFyAUSg_So11URLResponseCSgs5Error_pSgtcfU_TA + 216
    6   RestEssentials                      0x000000010abbd6f7 _T010Foundation4DataVSgSo11URLResponseCSgs5Error_pSgIxxxx_So6NSDataCSgAGSo7NSErrorCSgIyByyy_TR + 263
    7   CFNetwork                           0x000000011024c208 __75-[__NSURLSessionLocal taskForClass:request:uploadFile:bodyData:completion:]_block_invoke + 19
    8   CFNetwork                           0x000000011024ba6d __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 147
    9   Foundation                          0x000000010d1c79b7 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 7
    10  Foundation                          0x000000010d1c781a -[NSBlockOperation main] + 68
    11  Foundation                          0x000000010d1c5cd6 -[__NSOperationInternal _start:] + 778
    12  libdispatch.dylib                   0x000000010fd5443c _dispatch_client_callout + 8
    13  libdispatch.dylib                   0x000000010fd59af4 _dispatch_block_invoke_direct + 592
    14  libdispatch.dylib                   0x000000010fd5443c _dispatch_client_callout + 8
    15  libdispatch.dylib                   0x000000010fd59af4 _dispatch_block_invoke_direct + 592
    16  libdispatch.dylib                   0x000000010fd59884 dispatch_block_perform + 109
    17  Foundation                          0x000000010d1c1ce4 __NSOQSchedule_f + 342
    18  libdispatch.dylib                   0x000000010fd5443c _dispatch_client_callout + 8
    19  libdispatch.dylib                   0x000000010fd5a856 _dispatch_continuation_pop + 967
    20  libdispatch.dylib                   0x000000010fd58c86 _dispatch_async_redirect_invoke + 780
    21  libdispatch.dylib                   0x000000010fd601f9 _dispatch_root_queue_drain + 772
    22  libdispatch.dylib                   0x000000010fd5fe97 _dispatch_worker_thread3 + 132
    23  libsystem_pthread.dylib             0x00000001102175a2 _pthread_wqthread + 1299
    24  libsystem_pthread.dylib             0x000000011021707d start_wqthread + 13
    

    If there's anything else I can help with, just tag me.

    opened by aravasio 3
  • Pod install errro

    Pod install errro "SWIFT_VERSION"

    Hi i'm working with Swift 4, without flag use_frameworks!, and have this error

    pod install

    Installing RestEssentials (4.0.2)
    [!] Unable to determine Swift version for the following pods:
    
    - `RestEssentials` does not specify a Swift version and none of the targets (`SomeProjectTests`) integrating it have the `SWIFT_VERSION` attribute set. Please contact the author or set the `SWIFT_VERSION` attribute in at least one of the targets that integrate this pod.
    
    opened by JuanSeBestia 2
  • Weird issue when evaluating for .int on a raw value.

    Weird issue when evaluating for .int on a raw value.

    Ok, this is super weird and, as far as I understand it, it's hard to believe I did not come across this sooner.

    Given the following JSON

    {
        "error_code" = 02;
        "error_description" = "Invalid credentials";
        result = 1;
    }
    

    if I evaluate as such:

    if let errorCode = json["error_code"].int, errorCode != 5 {
        //code
    }
    

    it will not enter, since the .int evaluation will return nil. It seems the issue is in the numerical eval,

    public var numerical: NSNumber? {
            return raw as? NSNumber
    }
    

    Printing those same cases gives the following results:

    (lldb) po self.raw
    02
    --------
    
    (lldb) po raw as NSNumber
    Could not cast value of type 'NSTaggedPointerString' (0x1066f4cd8) to 'NSNumber' (0x1056fe600).
    error: warning: couldn't get required object pointer (substituting NULL): Couldn't load 'self' because its value couldn't be evaluated
    
    error: Execution was interrupted, reason: signal SIGABRT.
    The process has been returned to the state before expression evaluation.
    --------
    
    (lldb) po self.raw as Int
    Could not cast value of type 'NSTaggedPointerString' (0x1066f4cd8) to 'NSNumber' (0x1056fe600).
    error: warning: couldn't get required object pointer (substituting NULL): Couldn't load 'self' because its value couldn't be evaluated
    
    error: Execution was interrupted, reason: signal SIGABRT.
    The process has been returned to the state before expression evaluation.
    --------
    
    (lldb) po self.raw as? String
    ▿ Optional<String>
      - some : "02"
    
    

    Any ideas on what might be causing this?

    It might be worth noting that "error_code" : 2 on the actual server response, for some reason during conversions and passing, RestEssentials seems to convert it to 02, but on postman it's just 2. No idea how relevant this might be, but I'm putting this out there.

    opened by aravasio 2
  • NSCocoaErrorDomain Code=3840  Error

    NSCocoaErrorDomain Code=3840 Error

    Hi Sean, The new version remove the put Error I was getting. I am trying to use the Put method to send a file. The interface is for a project called Agiloft. The rest method I am using requires, "Attaches the file passed in the body of the request to the specified field of the record identified by the supplied primary key." I am still trying to figure out how to upload it that what. It is a PDF file and I don't see to understand it yet. The Agiloft indicates that if it were an HTML for it should look like this: ** Characters removed to display ** form method="post" action="https://xxxxxxxx.com/ewws/EWAttach" enctype="multipart/form-data"> input name="$KB" value="Demo" /> input name="$table" value="case" /> input name="$lang" value="en" /> input name="$login" value="admin" /> input name="$password" value="qwerty" /> **input type="file" name="inbound_attachments"/>** input type="submit" value="submit" /> /form>

    The error mentioned int he subject line is happening when I try and do a GET. I was not having that issue before the new release. CORRECTION I have resolved the issue mentioned in the subject line but and still working on the file upload issue.

    Any Thoughts?

    Thanks for all your hard work on this project!

    opened by jrlanders 2
Owner
null
Lightweight REST library for iOS and watchOS. Available on cococapods

RMHttp RMHttp is a Lightweight REST library for iOS and watchOS. Features Chainable Request URL / JSON Parameter Encoding HTTP Methods GET/POST/DELETE

Roger Molas 7 Nov 19, 2022
Elegantly connect to a JSON api. (Alamofire + Promises + JSON Parsing)

⚠ Important Notice: Farewell ws... hello Networking ! Networking is the next generation of the ws project. Think of it as ws 2.0 built for iOS13. It u

Fresh 351 Oct 2, 2022
Simple REST Client based on RxSwift and Alamofire.

RxRestClient Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements iOS 10.0+ tvOS 10.

STDev 16 Nov 19, 2022
Simple REST Client based on RxSwift and Alamofire.

RxRestClient Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements iOS 10.0+ tvOS 10.

STDev 16 Nov 19, 2022
The civilized way to write REST API clients for iOS / macOS

The elegant way to write iOS / macOS REST clients Drastically simplifies app code by providing a client-side cache of observable models for RESTful re

Bust Out 2.2k Nov 20, 2022
TheraForge's Client REST API framework to connect to TheraForge's secure CloudBox Backend-as-a-Service (BaaS)

OTFCloudClientAPI TheraForge's Client REST API Framework to Connect to TheraForg

TheraForge 0 Dec 23, 2021
Swish is a networking library that is particularly meant for requesting and decoding JSON via Decodable

Swish Nothing but net(working). Swish is a networking library that is particularly meant for requesting and decoding JSON via Decodable. It is protoco

thoughtbot, inc. 369 Nov 14, 2022
QwikHttp is a robust, yet lightweight and simple to use HTTP networking library for iOS, tvOS and watchOS

QwikHttp is a robust, yet lightweight and simple to use HTTP networking library. It allows you to customize every aspect of your http requests within a single line of code, using a Builder style syntax to keep your code super clean.

Logan Sease 2 Mar 20, 2022
Lightweight library for web server applications in Swift on macOS and Linux powered by coroutines.

Why Zewo? • Support • Community • Contributing Zewo Zewo is a lightweight library for web applications in Swift. What sets Zewo apart? Zewo is not a w

Zewo 1.9k Dec 22, 2022
A barebones Swift HTTP client with automatic JSON response parsing.

HTTP Client A barebones Swift HTTP client with automatic JSON response parsing. Installation Add HTTP Client as a dependency through Xcode or directly

Joe Masilotti 30 Oct 11, 2022
An Alamofire extension which converts JSON response data into swift objects using EVReflection

AlamofireJsonToObjects ?? This is now a subspec of EVReflection and the code is maintained there. ?? You can install it as a subspec like this: use_fr

Edwin Vermeer 161 Sep 29, 2022
Lazily deserialize JSON into strongly typed Swift objects

LazyObject Lazily deserialize JSON into strongly typed Swift objects, with a few getter style options. Is your app using it? Let me know! Installation

rob phillips 11 Nov 16, 2022
A lightweight but powerful network library with simplified and expressive syntax based on AFNetworking.

XMNetworking English Document XMNetworking 是一个轻量的、简单易用但功能强大的网络库,基于 AFNetworking 3.0+ 封装。 其中,XM 前缀是我们团队 Xcode-Men 的缩写。 简介 如上图所示,XMNetworking 采用中心化的设计思想

KANGZUBIN 981 Dec 29, 2022
A lightweight library for writing HTTP web servers with Swift

Taylor Disclaimer: Not actively working on it anymore. You can check out some alternatives Swift 2.0 required. Working with Xcode 7.1. Disclaimer: It

Jorge Izquierdo 925 Nov 17, 2022
Super lightweight async HTTP server library in pure Swift runs in iOS / MacOS / Linux

Embassy Super lightweight async HTTP server in pure Swift. Please read: Embedded web server for iOS UI testing. See also: Our lightweight web framewor

Envoy 540 Dec 15, 2022
To practice URLSession to fetch json data from open weather API

⛅️ weatherApp-iOS-practice ?? 기능 상세 도시 이름을 입력하면 현재 날씨 정보를 가져와 화면에 표시되게 만들어야 합니다

Jacob Ko 0 Dec 18, 2021
Enable WebSocket in OPC DA/AE Server with JSON return, first time ever

WebSocket4OPC Enable WebSocket in OPC DA/AE Server with JSON return, first time ever DCOM was developed more than 2 decades ago, wich was the pillar o

null 13 Dec 14, 2022
A lightweight, one line setup, iOS / OSX network debugging library! 🦊

Netfox provides a quick look on all executed network requests performed by your iOS or OSX app. It grabs all requests - of course yours, requests from

Christos Kasketis 3.4k Dec 28, 2022
📡 RealHTTP is a lightweight yet powerful client-side HTTP library.

RealHTTP RealHTTP is a lightweight yet powerful client-side HTTP library. Our goal is make an easy to use and effortless http client for Swift. Featur

Immobiliare Labs 233 Jan 7, 2023