Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/stdevtm/rxrestclient
Simple REST Client based on RxSwift and Alamofire.
https://github.com/stdevtm/rxrestclient
alamofire reactivex rest rest-api rxswift
Last synced: 7 days ago
JSON representation
Simple REST Client based on RxSwift and Alamofire.
- Host: GitHub
- URL: https://github.com/stdevtm/rxrestclient
- Owner: STDevTM
- License: mit
- Created: 2018-04-02T05:32:49.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-03-17T05:53:54.000Z (over 1 year ago)
- Last Synced: 2024-07-30T06:03:45.038Z (4 months ago)
- Topics: alamofire, reactivex, rest, rest-api, rxswift
- Language: Swift
- Homepage:
- Size: 492 KB
- Stars: 16
- Watchers: 4
- Forks: 7
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# RxRestClient
[![CI Status](https://github.com/STDevTM/RxRestClient/workflows/RxRestClient/badge.svg?branch=master)](https://github.com/STDevTM/RxRestClient/actions)
[![Version](https://img.shields.io/cocoapods/v/RxRestClient.svg?style=flat)](https://cocoapods.org/pods/RxRestClient)
[![License](https://img.shields.io/cocoapods/l/RxRestClient.svg?style=flat)](https://cocoapods.org/pods/RxRestClient)
[![Platform](https://img.shields.io/cocoapods/p/RxRestClient.svg?style=flat)](https://stdevtm.github.io/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.0+
* macOS 10.12+
* Swift 5.6+
* Xcode 13+## Migration Guides
- [RxRestClient 2.0 Migration Guide](./Documentation/RxRestClient%202.0%20Migration%20Guide.md)
## Installation
CocoaPods
RxRestClient is available through CocoaPods. To install it, simply add the following line to your
Podfile
:pod 'RxRestClient'
Swift Package Manager
You can use The Swift Package Manager to install
RxRestClient
by adding the proper description to yourPackage.swift
file:import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.package(url: "https://github.com/STDevTM/RxRestClient.git", from: "2.1.0")
]
)Next, add
RxRestClient
to your targets dependencies like so:.target(
name: "YOUR_TARGET_NAME",
dependencies: [
"RxRestClient",
]
),Then run
swift package update
.## Features
* Simple way to do requests
* Simple way to have response state in reactive way
* Ability to customization
* Retry on any error
* Handle network reachability status
* Retry on become reachable
* Ability to use absolute and relative urls
* Swift Codable protocol support
* Use custom SessionManager
* Pagination support
* [Complete Documentation](https://stdevtm.github.io/RxRestClient/)
* _more coming soon_## How to use
First of all you need to create `struct` of your response state and implement `ResponseState` protocol.
```swift
struct RepositoriesState: ResponseState {typealias Body = Data
var state: BaseState?
var data: [Repository]?private init() {
state = nil
}init(state: BaseState) {
self.state = state
}init(response: (HTTPURLResponse, Data?)) {
if response.0.statusCode == 200, let body = response.1 {
self.data = try? JSONDecoder().decode(RepositoryResponse.self, from: body).items
}
}static let empty = RepositoriesState()
}
```It is required to mention expected Body type (`String` or `Data`).
After that you need to create request model:
```swift
struct RepositoryQuery: Encodable {
let q: String
}```
Then you can do the request to get repositories:
```swift
import RxSwift
import RxRestClientprotocol RepositoriesServiceProtocol {
func get(query: RepositoryQuery) -> Observable
}final class RepositoriesService: RepositoriesServiceProtocol {
private let client = RxRestClient()
func get(query: RepositoryQuery) -> Observable {
return client.get("https://api.github.com/search/repositories", query: query)
}
}```
In order to customize client you can use `RxRestClientOptions`:
```swift
var options = RxRestClientOptions.default
options.addHeader(key: "x-apikey", value: "")
client = RxRestClient(baseUrl: ), options: options)
```### Relative vs absolute url
In order to use relative url you need to give `` when initializing client object.
```swift
let client = RxRestClient(baseURL: )
```When calling any request you can provide either `String` endpoint or absolute `URL`. If you will `String` it will be appended to `baseURL`.
```swift
client.get("rest/contacts")
```If `baseURL` is `nil` then it will try to convert provided `String` to `URL`.
In order to use absolute url even when your client has `baseURL` you can provide `URL` like this:
```swift
if let url = URL(string: "https://api.github.com/search/repositories") {
client.get(url: url, query: ["q": search])
}
```### Pagination
Pagination support is working only for `GET` requests. In order to have pagination (or infinite scrolling) feature you need to implement following protocols for query and response models:
For query model you need to implement `PagingQueryProtocol`:
```swift
struct RepositoryQuery: PagingQueryProtocol {let q: String
var page: Intinit(q: String) {
self.q = q
self.page = 1
}func nextPage() -> RepositoryQuery {
var new = self
new.page += 1
return new
}
}
```For response model you need to implement `PagingResponseProtocol`:
```swift
struct RepositoryResponse: PagingResponseProtocol {
let totalCount: Int
var repositories: [Repository]private enum CodingKeys: String, CodingKey {
case totalCount = "total_count"
case repositories = "items"
}// MARK: - PagingResponseProtocol
typealias Item = Repositorystatic var decoder: JSONDecoder {
return .init()
}var canLoadMore: Bool {
return totalCount > items.count
}var items: [Repository] {
get {
return repositories
}
set(newValue) {
repositories = newValue
}
}}
```For response states you need to use `PagingState` class or custom subclass:
```swift
final class RepositoriesState: PagingState {
...
}
```After having all necessary models you can do your request:
```swift
client.get("https://api.github.com/search/repositories", query: query, loadNextPageTrigger: loadNextPageTrigger)
````loadNextPageTrigger` is an `Observable` with `Void` type in order to trigger client to do request for next page using new query model generated using `nextPage()` function.
## Author
Tigran Hambardzumyan, [email protected]
## Support
Feel free to [open issues](https://github.com/stdevteam/RxRestClient/issues/new) with any suggestions, bug reports, feature requests, questions.
## Let us know!
We’d be really happy if you sent us links to your projects where you use our component. Just send an email to [email protected] and do let us know if you have any questions or suggestion.
## License
RxRestClient is available under the MIT license. See the LICENSE file for more info.