Async and server communication
In this chapter we will use axios - a popular HTTP client.
To use it, open command line in the root of the project (where package.json is located) and type:
npm install --save axios
Stop and rerun the project with dotnet run.
ASP.NET Core API controllers
ASP.NET Core doesn't have different namespaces or base classes for MVC and API. Instead, all controllers simply inherit Microsoft.AspNetCore.Mvc.Controller class and return either a view or data.
Simple controller with no action is implemented as:
[Route("api/[controller]")]
public class MoviesController : Controller
{
}
Notice that the route gives us /api/movies prefix for all actions.
Simple GET action can be defined as:
[HttpGet]
public IEnumerable<Movie> GetAllMovies()
{
return new[]
{
new Movie {
Id = 1,
IsWatched = true,
Title = "Matrix 1"
},
// ...
};
}
Navigate to http://localhost:5000/api/movies to see the expected JSON output
Consuming API in client
axios is promised based which means that it is asynchronous by default. Promise<T> in ECMAScript is similar to Task<T> in C# world.
Once you have a promise, you can chain the next steps on it using the then method and finally catch errors using catch method.
Example:
axios.get('/api/sampledata')
.then(r => {
// r is a HTTP response
// r.data is the data from web
// service already deserialized into object
let data = r.data
})
.catch(e => {
// handle errors, usually this is the last chain link
})
Using it inside react is quite easy, just call setState in then and/or catch methods.
async-await
Using then and catch forces us to write smaller callbacks and use fluent style. Typescript (and future versions of ECMAScript) offer C#-like syntax for writing async code.
async function getSampleDataAsync() {
let data = await axios.get('/api/sampledata')
}