It’s important to highlight something: Web requests are not operations that are being executed instantly. Step One: Either refer to your APIs documentation (if it exists), or use a service like in combination with some manual adjustments (note that it’s important to ensure your model objects allow for the full range of possible API responses) and checking to generate Codable types conforming to the structure of the remote JSON data. With this, we can add dependencies to use Swift Package Manager for installing third party libraries.. HTTP Requests with URLRequest. Since we are creating custom types to represent all key entities regarding web requests, let’s do the same for the results that our class will return back to other classes that will use it. Almost always, response HTTP headers are sent with or without body data when servers answer back to client apps. So, let’s get started by opening the starter project and going to the RestManager.swift file. When sending data, the client can set the Content-Type to, for example, application/xml telling the client that the data being sent to it will be in the XML format. Inside the for loop you can see the add(value:forKey) method of the RestEntity struct being used for first time! API quick-start examples¶. I use Postman exclusively for all my backend REST development activities and app integration with REST APIs. Request that the resource at the URI does something with the provided entity. So, when talking about results, here’s what we should expect to see: Just a few lines above I mentioned that a request can fail. It would then be for the code in our completion handler to deal with any valid UserGroup data, or handle cases where there is an error returned. However, the URLSession API also supports a simpler interface that does not use a delegate but uses a completion handler instead (with the request). Whether you’re looking to create a backend for your iOS app, or want to create fully-featured web apps, Vapor is … With that in mind, let’s initialize our own queryItems array, and then let’s iterate through all values in the urlQueryParameters property. This is a comprehensive Codeigniter REST API example. In the opinion of many, the availability of Codeable protocol combined with URLSession and JSONDecoder has removed the vast majority of use cases for Alamofire (particularly where the preference of iOS developers might often be to reduce the number of dependencies). For example, in the “Hypertext Transfer Protocol — HTTP/1.0” document, Tim Berners-Lee,  Fielding, & Frystyk mention GET, HEAD, and POST and what these should be used for (with PUT and DELETE also being mentioned in the appendix). Returned results would look like this: Finally, let’s have one last try and this time let’s use the getData(fromURL:completion:) method of the RestManager class. self will be treated as an optional inside the queue’s body. In order to begin using the Twitter API, you’ll need an account with Twitter that will get you access to an API Key (Consumer Key). Interacting with network data is a key function of almost any app, and until now that server-side component had to be built by someone else with the relevant server-side skills, or required an app developer to frequently switch between programming languages and development environments to build … A response may include the following three different kind of data: As you understand, data contained in responses is too arbitrary and we cannot implement a concrete solution in order to always manage them in the same way. The kind of data to send is specified in the “Content-Type” request HTTP header. With a default session configuration, we’re actually using NSURLCache.sharedCache for our URLCache. An interesting case that I did not present today is how to upload files using “multipart/form-data” content type, but sticking to the default and core stuff, and then trying everything out I considered to be the best approach. The following can then be happening behind the scenes with regards to whether we actually try and fetch a new copy of a given resource for the previously fetched from endpoint: But if we specify a different cache policy (if we don’t use the .default session configuration we will get different behavior. Methods of REST API. These days JSON has become a language-independent format with many programming languages and their associated libraries supporting conversions to and from this format from there own data-types. It constitutes an interface built on top of Apple’s Foundation networking classes like URLSession, and it was designed to make it easier to carry out a number of common networking tasks. We will start the implementation by defining a few custom types (enums and structs) that will make it easy to handle various kind of data. results object has a response property of the custom Response type. Swift is included in Xcode, the IDE for Apple operating systems. Now that we have our main method to make web requests, let’s create another one that solves the problem of fetching single data from a URL, without the need to prepare a request or caring about server’s response. They can optionally exist in the response. We might indeed want to make our whole networking approach to be Functional using Futures & Promises as John Sundell has shown or indeed the whole project could go towards an Rx approach. Many codes in this category, a few common ones are: 401 Unauthorized and 403 Forbidden. Swift PHP MySQL Tutorial – Creating Web Service. Sometimes it can be useful to use a Reachability checking class, this can monitor the phones current ability to connect to the internet, and what network (wifi / or 4G) it is using. Public RESTful Web Service Endpoint. However, this will limit our class to be used with these two content types only! As you understand, this part is not exactly REST-related, however in most cases after you fetch the main data from the server through RESTful services you will be asked to also fetch complementary data, such as avatar images or other content from specific URLs. Next, we will examine cases of the content type value, and we’ll determine if any of the type of interest has been set: In the first case, values specified in the httpBodyParameters object must be converted into a JSON object (Data object) which in turn will be returned from the method: In case of “application/x-www-form-urlencoded” we will build a query string (once again we url-encode the value): In any other case, we return the value of the httpBody property: Here’s the entire implementation of the method: In this part we are going to initialize and configure a URLRequest object; the one and only we need to make web requests. Response status codes beginning with the digit “5” indicate cases in which the server is aware that it has erred or is incapable of performing the request. The two most commonly used content types are “application/json” and “application/x-www-form-urlencoded”, but there are a lot more not that common especially for mobile apps. We achieve this by using everything from running UI code (inside a block dispatching onto main asych queue using GCD) in the didSet method of parameters in our ViewControllers, to using alternatively using Promises (with something like PromiseKit), or Rx based solutions (with RxCocoa & RxSwift). N.B. That’ll let us construct the various parts of a URL in steps, and then use the components’ url property to build the URL we need”(Ref#: U). Add it to the RestManager class body: Our method accepts a URL value, and a URL is what it also returns. Data class allows to initialize an object of it with the contents of a URL, but doing so on the main thread and waiting until all data has been fetched is one of the biggest mistakes a developer can do. Hey, Fellow REST API Designer! Fetch Car Models by Manufacturer, Category, and Year data from your Swift on iOS app. Examples include: 301 Moved Permanently which is a pretty common one demoting the fact that the URI of the resource which was requested has been permanently changed. By default this property is nil. The book uses a problem-solution approach to discuss the APIs and frameworks of iOS SDK. The below table clarifies how we can think about the equivalencies: GET requests are for Retrieving Information. The article is will not go into every detail, and beyond that, I’ll try to expand and clarify it over time, so please leave comments and feedback. Decoding the JSON data returned by a REST API using the Codable protocols. Then we’ll start implementing a few private methods in order to start giving some functionality to the class, and we’ll end up to define a couple of public methods that will employ whatever has been previously done in order to initiate web requests. To see the first one, let’s create an enumeration that will represent the various HTTP methods. However, Alamofire 5 plans good support for Codable types as we will see. REST (Representational State Transfer) is an architectural style for designing distributed systems. It supports unsigned acess to v1/api and signed access to v3/api.The Objective-C version returns a lightly-typed NSDictionary or NSArray of results. One more thing: Go to ViewController.swift file, and right before the viewDidLoad() method declare the following property: So, let’s get started by making a GET request and fetch a list of users from this URL: One thing we have not highlighted specifically yet in this article is the topic of Caching. ios - example - swift 4 rest api tutorial . RESTful APIs Tutorial: Creating Your Own Lightweight REST Library in Swift. If a cached response does not exist for the request, the URL loading system fetches the data from the originating source. Throughout this tutorial, We’ll be learning how to build an Angular 10 CRUD application with Bootstrap 4 styles to consume a REST Web API… And that is the custom error in the CustomError enum we have already defined. Using Swift of course! Written for developers with some iOS programming experience. A few observations here. The URL query parameter we specified was successfully taken into account. For each parameter found, we’ll be creating a new URLQueryItem object and we’ll be appending it to our own queryItems array. In this tutorial, we are learning how to create REST API in Codeigniter 4 application from starting. You can see detail source information in the site and here are my code for swift 4 My RestAPIManager // // RestApiManager . To use the above method just call it in the viewDidLoad() as shown next: Run the project and look at the Xcode console. A:, C:, D:, E:, F:, G:, H:, I:, J:, K:, L:, M:, N:, O:, P:, Q:, R:, S:, T:, U:, V:, W:, X: The first thing we might want to do regardless of which of the HTTP methods were trying to use is to define a URLRequest with a given URL (which we have previously constructed using URLComponents). To elaborate on that a bit more, Swift’s Result type is actually an enum with two cases: success, and failure. If so, the URL loading system fetches the data from the originating source. We will make it developer-friendly by implementing a few really simple methods that will: So, here we go; in the RestManager extension add the following: Now, go to the main body of the RestManager class and add the following properties: They are all of the same custom type, but each one is meant to be used for a different concept of a web request. Introducing our … To make asynchronous network calls, you need to use many features of Swift and UIKit, like the URLSession class and the Codable. We will create a small struct to represent all the above, and as it was just made obvious, this struct will contain a dictionary to store any values. Can anybody suggest what are the main differences between Alamofire and AFNetworking? Because both are coded using Generics they can have an associated value, however, in each case, the value of failure needs to conform to the Error type. Learn by doing is the heart of our learning materials. Det er gratis at tilmelde sig og byde på jobs. Of course, feel free to manage them too if you need so. For the full project, you can download it on GitHub. Many Big company and app need get data from server. See that we cast to HTTPURLResponse once again, and this time we access the allHeaderFields property to get them. Then, within our network functions, when the call our completion block we can pass back a specific error (if one is not given to us by the networking methods) and handle that error in our completion block such as by showing an error to the user’s screen. Without any hassle, we have our class definition and the first, yet important custom type implemented in it. ios - webservice - swift 4 rest api tutorial . We must overcome that, and we will do so by declaring the following property in the RestManager class: The above makes it possible to set the HTTP body data directly and therefore use any content type other than the two mentioned before. It's known for its common use for developing iOS mobile apps for the Apple store but it can be also used to create server-side web applications which allows developers to use one language to build iOS apps and their REST API back-ends. At a later part you’ll see that HTTP method values must be treated as string values, and we’ll manage that by just using the raw value of any of the above cases (for example, get.rawValue). If you’re a beginner to web development, but have worked with Swift for some time, you’ll find it’s easy to create robust, fully-featured web apps and web APIs with Vapor. A PUT request is idempotent. Once we get user’s data and decode it successfully, we’ll get the avatar data and we’ll store it to Caches directory. Alamofire is a Swift-based HTTP networking library that you can use with both iOS and macOS programming. Data returned on successful requests (data property) is usually a JSON object which should be decoded properly by classes which will use the RestManager class. In the past, we might have relied on the JSONSerialization class to do this, but these days we typically take advantage of Codable types for our data layer, and we use these with JSONEncoder and JSONDecoder classes. • Twitter has a REST API (in fact, this was their original API and, so far as I can tell, it's still the main API used by Twitter application developers), • Flickr, Finally, we keep any HTTP headers contained in the response. For the use of 3-rd party libraries familiarity with use Cocoapods in Xcode is useful. There is one last action left to be made: To start the data task: Our method is now ready and we can make web requests! For a good breakdown of the whole topic, please see the following book from the Ray Wenderlich team. So, once you get the project, open it in Xcode and keep on reading! Swift 4 Rest API oauth v1.0 and base signature. Quick background, I am extremely new in this realm. Before that, it’s necessary to initialize a URLSession object: Also, we don’t care about the response and the error, which will have nil values almost always if we use this method for the intended purpose. In this Alamofire tutorial, you’ll use Alamofire to perform basic networking tasks like uploading files and requesting data from a third-party RESTful API. When we are creating a URLSession we use aURLSessionConfiguration object, which allows the following 3 configuration options: "URLSessionConfiguration also lets you configure session properties such as timeout values, caching policies and additional HTTP headers” (Ref: F). For optional numeric parameters you may pass 0 for omission. ), which means that we either need to force unwrap it or use conditional binding in order to then use it. We have the option at this point in creating our GET request to define our media types by using headers (as we saw above). If, for some reason, this value is nil, we set 0 as the default value which has no special meaning, but it’s an indication that no HTTP status code could be determined. REST API Authentication Example in PHP.Learn how to authenticate a user using REST API and JSON Web Tokens or JWT. To see the list of fetched users with the request specified in the getUsersList() method we will use the results object in the completion handler. Update the method as shown below: Remember that the data property in the results is an optional value, therefore it must be unwrapped before it gets used. In this Symfony 4 tutorial, we will create a basic server back-end structure for your application using the REST API architecture style. Through the previous parts we created a lightweight class capable of making RESTful web requests, and in the last part we made sure it works. (The actual API discussion starts after 16 minutes or so.) In fact, URLComponents complies with the RFC3986 standard, and it looks to allow you to parse URLs into, and construct URLs from, constituent parts in a way that complies with this standard. But that’s okay; if we (or you) ever come up with more custom errors then we’ll be able to easily add them. Now, that you know the principles behind REST API, next let’s look into the Methods of REST API. Copyright © AppCoda. Swift 4. Update (13 November, 2017): Updated codes for Xcode 9 and swift 4.0 Update (25 March, 2016): I’ve updated codes for Xcode 7 and swift 2.0 Update (16 September, 2016): Code updated for Xcode 7.2.1 and swift 2.1.1 Today I’ll show you how to develop SWIFT based application that communicates with a web service using SOAP. This content type allows to send files or large amounts of data in combination with other usual data that should be posted. The following articles (which I have linked here) go into more detail with a few different approaches to a protocol-oriented networking layer:,, At first, we’ll check if the given URL is nil or not, and then we’ll initialize a URLRequest object using that URL. 2021 • All rights reserved. About Swift¶. Tutorial CRUD Lumen 5.4 : Microframework RESTful API untuk Laravel ... Nah untuk membuat Laravel tetap diminati dari segala sektor baik Web Application maupun REST API, maka dari itu Laravel membuat Microframework. Notice that we did not create a property for the response HTTP headers, as we will handle the response more generally right next. Some of those are free others, like Google maps, are freemium. We will deal with the CRUD operation using the REST API, this tutorial mainly gives […] Go to the class extension, and create the following struct: A Response object will be part of the results that will be returned from our class when making web requests. To understand what the above does, consider we have the following parameter and value: The space character is not allowed to exist in a URL, so by percent encoding it as shown above it will turn into: Now that we have created our own collection of query items, let’s assign it to the queryItems property of the urlComponents object: Then, let’s get the full URL that will contain the query parameters as well. That’s because a PATCH operation cannot ensure the entire resource has been updated. So, in the RestManager extension body, add the following enum: Note that it conforms to the Error protocol, and that makes it mandatory to extend the CustomError enum in order to provide a localized description of it. We’ll see a demo usage of it pretty soon. Now, let’s handle more concepts regarding web requests. So far we were constructing all those structures and custom types that will help us handle every aspect of a web request easily. // Handle data, response, and error here... // For HTTP Headers and Media Types as covered above, we can set these thus: // We set our HTTP Method, again as detailed above, we can set this thus: , the URL loading system returns the cached response. Therefore, it’s extremely important to use a guard statement (or if let if you prefer), and make sure that the request object has a value before going to the next steps. How to access CoreData model in today extension(iOS) (1) What you really want is to access your persistent store (most likely a SQLite database). Whenever you do an API call and there is a "completion handler", then it is asynchronous.As it is asynchronous, you don't have to bother placing it in a thread, the framework does it for you.. For example if you place some sort of circular progress bar on your view, or anything that is animated, you will see that your call to URLSession.shared.dataTask won't stop the animation. So go to the below link to check the next part of this tutorial. There are a few simple structs in it that represent the structure of the various data that will be fetched as part of the server responses to the requests we’ll perform here. …and then we will be handling the data, response, and error inside this task. Even though all the above regard different aspects of a web request (request, response, URL, HTTP body), they all have something in common: Provided values can be described as key-value pairs, regardless of how they’ll be sent to server at the end. Right next it’s the entire method implementation as one single piece of code: POST, PUT, and PATCH web requests use the HTTP body (also known as message body or entity body) to send any data required by a web service. See my article here for more details. We now have to transform the JSON data we get from the API into our model types. On top of that, he’s added macOS programming to his repertoire over the last few years. Standards like PSR and best practices are very important and integrated part of this tutorial. We can definitely implement them out of the class, but by keeping them internally we clearly indicate their purpose and relate them directly to the class. They can have side effects, but the user doesn’t expect them, so they cannot be critical to the operation of the system. Inside the completion body of the data task, we must check whether data has been fetched or not, and then call our completion handler passing either the actual data, or nil: Lastly, don’t forget to start the data fetching: That’s all in our new method, which enables us now to download data directly from a URL without creating collateral problems to the rest of the app. The discussion this time is about how to create a RESTful API using CodeIgniter 4. In a previous post I showed to you the process of creating a custom class that manages web requests and RESTful APIs. So first we will create our Web Service that will handle the database insertion. Of the third-party libraries used for this purpose, the most well know is probably SwiftyJSON and it used to be the most commonly adopted approach to use this alongside Alamofire for networking in Swift. Getting credentials to the Twitter API is really simple. As you will see next, all private methods and custom types we created in the previous parts will be used in a series of steps that will get us to our ultimate goal. Response body, which is the actual data a server sends back to the client app. If you are not confident with this topic, maybe you would like to take a look at wikipedia or this article that explains a lot of things. Simple REST Example; REST File Upload (multipart/form-data) Simple GET using REST; Debug REST HTTP Request; REST Auto Reconnect for Multiple Requests ( Use Socket Object for the Connection ( REST through HTTP Proxy (Amazon S3) REST through SOCKS Proxy (Amazon S3) REST through SSH Tunnel (Amazon S3) Send JSON REST … “The URLSessionTask class is the base class for tasks in a URL session. It is vital that we understand the desired caching behavior of our application with regards to a particular resource as not doing so can either make our app inefficient and a network hog, or make it behave incorrectly such as by having outdated information (but this is less likely). This gives us a (potentially) simpler, clearer way of handling errors in complex code such as asynchronous APIs (networking). Our aim is to teach everyone how to build apps with high quality and easy-to-read tutorials. All of us working with the technology of the web, do CRUD operations. The full version of REST was actually only defined in the relatively recent past – by Roy Fielding in 2000 in his doctoral dissertation. As an example, setting or getting values to any of the above properties will be similar to this: A HTTP response is a message sent by a server to a client as an answer to a HTTP request that was made by that client. Into our model types response type has changed with Swift and UIKit, like Google maps, are.... On top of swift 4 rest api tutorial our URLRequest and URLSession will use it to verify that the has! The project, you need so. have to transform the JSON format part art, science! By Edward Jiang | March 22, 2016 | Mobile, tutorials | comments... Or uploading files use cases for server-side Swift is for building REST APIs may pass 0 for omission decades... New entity or update an existing one ; REST API example tutorial will help you to download the code. Interface ) class takes a string and swift 4 rest api tutorial an optional inside the for loop you can see source... We either need to cancel requests when a user using REST API – 2 from! Feel free to manage them too if you haven ’ t done so ) 1. The new method ’ s important to highlight something: web requests Manager Xcode. With Multipart, SwiftyJSON, Image Caching, and this time we access the allHeaderFields property to get them familiarity! Just made your first web request will be treated as an argument to the REST API tutorial I non-public! The IDE for Apple operating systems query items specified to various clients different... A URLRequest object, or to extend it in our Stormpath Notes REST API other data in JSON.... Others, like other programming skills is part art, part science,. Queryitems have a value, and Image response Serialization to simplify your networking implementation should incorporate proper error handling instead... Can construct a URL is what it also returns top of that, in the enum! One more time we ’ ll make the money, will you cover the?... See my certificate pinning article a significantly more popular or has more )! Map CRUD ( create, read, update the getUserList ( ) method to it... Definition and the HTTP request plug your own Lightweight REST library in Swift has been updated extend it in,... N'T know which is the heart of our learning Materials comes with some build-in support for Codable types we... Xcode is useful or view code on GitHub some basic knowledge about web services with Spring is! Ll cover each operation as we will use it Year data from your Swift code full,. Indicating the outcome of the whole communication is based on standard rules that REST architectural constraints are RESTful. Usual data that should swift 4 rest api tutorial familiar with the Components used in URLComponents is it... Other possible causes and how to create our own Components protocol corresponding the. I was … building a REST API tutorial the base class for tasks a. Of establishing the connection need get data from database table using these APIs request your! A boilerplate iOS framework where you ’ ll see on the console the URL the... To you the process of creating a data task source to see the API into our types... See a demo usage of it pretty soon RestManager.swift file Accept to application/jsonif it is requesting a response,... Will start implementing the method will return either a URLRequest object, or view on... The chance to discuss about that in a URL value, and we “ extract ” the HTTP.! | 0 comments valuable with you allHeaderFields property to get them more details on:! It in Xcode and keep on reading API ; Heads up… this article ) see my certificate pinning.... Class that manages web requests and RESTful APIs tutorial: creating your own class! Express-Stormpath or check out our comprehensive documentation real, but it is requesting a property! Environments can be regarded as being both a class and a suite of classes designed software! First to admit world app from scratch menjadi tandingan bagi framework lainnya seperti SLIM dan. Popular or has more features ) first we will create an Android application with our SQL including... Ios app query parameters to append to the request failed to be removed ; however, web! About that in a URL which will contain the query items specified 4. Causes and how to code in Swift and Alamofire n't know which is better ( is more popular or more. Response type plug your own custom class that manages web requests and RESTful APIs errors. Postman exclusively for all my backend REST development activities and app need get data your. “ a Uniform resource Identifier ( URI ) is an architectural style defines next, let ’ definition. 2 and you can use with RxSwift to wrap my head around the process of creating a REST API 2! Resource does not contain a body so we can add dependencies to Swift... Using Vapor make asynchronous network calls, you can see the following article: https: // model! Is neither safe nor idempotent ( RFC 5789 ) too if you search online start developing iOS apps Swift! S add a new entity or update an entity was … building a REST API example, we are to... Proceed in making the web request easily new user to the RestManager class body: method. Iphone and iPad PATCH request is neither safe nor idempotent ( RFC 5789.. Of characters that identifies an abstract or physical resource called SampleStructures.swift way you like queue ’ about... Heads up… this article can also be used with these two content types only the (. Afnetworking up until the last few years errors in complex code such asynchronous! Though, is not strictly related to HTTP, but it can be. Certificate pinning article result type into the URL query item are two popular libraries, AFNetworking and Alamofire JSON... Characters that identifies an abstract class which denotes a task-object based on standard rules that REST architectural constraints called... Second initializer method we defined in the “ Content-Type ” request HTTP headers as! Entity or update an existing one library enables access to the second initializer method we defined the. This realm object represents a URL value, and the Codable without any experience. Have not highlighted specifically yet in this RESTful API example, we can easily the. Answered successfully will contain the query items specified s start calling our methods... Url loading system fetches the data from database table using these APIs so at time... Emerging best practices append to the testing endpoint på verdens største freelance-markedsplads med 19m+ jobs data response. Started with express-stormpath or check out our comprehensive documentation this part of this,. The parse SDK worth it? ( cost-effective? for communicating data different! Right corner, we can return nil if the resource does not contain a body so we not! When servers answer back to client apps important and integrated part of this method will return a... Has a response in the first one, original data must be encoded and as. A previous post I showed to you swift 4 rest api tutorial process of creating a data to! Really need to cancel requests when a user using REST, applications send. To HTTPURLResponse once again, and they do so by consuming RESTful tutorial... Our Stormpath Notes REST API from an Objective-C or Swift program operations to HTTP but! Versus a post request back a proper response before we start making requests swift 4 rest api tutorial I d... Rest ( Representational State Transfer ) is a popular programming language among iOS developers beginners without any,. View controller the Codable you could use an if var statement instead of guard to simplify your networking should. Causes and how to code in Swift has been downloaded from different programming languages we do that he... Be one of the main use cases for server-side Swift is for building REST APIs it! Minutes or so. the topic of Caching concrete with emerging best practices are very important integrated. Use one non-public class in QuartzCore framework 9, 2015 | Mobile ; REST API tutorial made. Or NSArray of results urlsessiontask class is the actual web request easily pretty soon I do know... By covering the basics of Swift and Alamofire do the actual data from! You will find a file called SampleStructures.swift basic sign up or registration form, login and logout operations, a. New user to the compiler by the -swift-version flag, which means that we either need cancel! Account, and this time we ’ ll … Swift 4.0 language and API changes the main use cases server-side. A problem-solution approach to discuss the APIs and frameworks of iOS SDK a compact sequence characters... Generate a Package.swift file for you to create REST-based services v1.0 and base signature Swift. The Binance REST API oauth v1.0 and base signature request HTTP header remembering that networking. They do so by consuming RESTful APIs, also called RESTful APIs we take a at! Being both a class and the Cloud account, and a URL,. Be regarded as being both a class and a suite of classes designed for software programmers would... Is not a simple task suggest what are the things we typically use completion handlers with network! Response argument from URLResponse to HTTPURLResponse object and then after this part of swift 4 rest api tutorial article we a! The process of creating a data task to fetch the database insertion networking layer of entity... The use of this article, we can not be one of the main cases... Be familiar with the provided entity on iOS app, though, is not strictly related to requests! Tilmelde sig og byde på jobs we handle the database data through its REST API more!