# Managing Data
At the end of [Routing](start/routing "Getting Started: Routing"), the online store application has a product catalog with two views: a product list and product details.
Users can click on a product name from the list to see details in a new view, with a distinct URL, or route.
This page guides you through creating the shopping cart in three phases:
* Update the product details page to include a "Buy" button, which adds the current product to a list of products that a cart service manages.
* Add a cart component, which displays the items in the cart.
* Add a shipping component, which retrieves shipping prices for the items in the cart by using Angular's `HttpClient` to retrieve shipping data from a `.json` file.
{@a services}
## Services
Services are an integral part of Angular applications. In Angular, a service is an instance of a class that you can make available to any part of your application using Angular's [dependency injection system](guide/glossary#dependency-injection-di "dependency injection definition").
Services are the place where you share data between parts of your application. For the online store, the cart service is where you store your cart data and methods.
{@a create-cart-service}
## Create the shopping cart service
Up to this point, users can view product information, and
simulate sharing and being notified about product changes.
They cannot, however, buy products.
In this section, you add a "Buy" button to the product
details page and set up a cart service to store information
about products in the cart.
Later, the [Forms](start/forms "Getting Started: Forms") part of
this tutorial guides you through accessing this cart service
from the page where the user checks out.
{@a generate-cart-service}
### Define a cart service
1. Generate a cart service.
1. Right click on the `app` folder, choose `Angular Generator`, and choose `Service`. Name the new service `cart`.
The starter code for the "Checkout" button already includes a `routerLink` for `/cart` the top-bar component.
` with an `*ngFor` to display each of the cart items with its name and price.
The resulting `CartComponent` template is as follows:
1. Test your cart component.
1. Click on "My Store" to go to the product list page.
1. Click on a product name to display its details.
1. Click "Buy" to add the product to the cart.
1. Click "Checkout" to see the cart.
1. To add another product, click "My Store" to return to the product list.
Repeat to add more items to the cart.
StackBlitz tip: Any time the preview refreshes, the cart is cleared. If you make changes to the app, the page refreshes, so you'll need to buy products again to populate the cart.
For more information about services, see [Introduction to Services and Dependency Injection](guide/architecture-services "Architecture > Intro to Services and DI").
## Retrieve shipping prices
Servers often return data in the form of a stream.
Streams are useful because they make it easy to transform the returned data and make modifications to the way you request that data.
The Angular HTTP client, `HttpClient`, is a built-in way to fetch data from external APIs and provide them to your app as a stream.
This section shows you how to use the HTTP client to retrieve shipping prices from an external file.
### Predefined shipping data
The application that StackBlitz generates for this guide comes with predefined shipping data in `assets/shipping.json`.
Use this data to add shipping prices for items in the cart.
### Use `HttpClient` in the `AppModule`
Before you can use Angular's HTTP client, you must configure your app to use `HttpClientModule`.
Angular's `HttpClientModule` registers the providers your app needs to use a single instance of the `HttpClient` service throughout your app.
1. Open `app.module.ts`.
This file contains imports and functionality that is available to the entire app.
1. Import `HttpClientModule` from the `@angular/common/http` package at the top of the file with the other imports. As there are a number of other imports, this code snippet omits them for brevity. Be sure to leave the existing imports in place.
1. Add `HttpClientModule` to the `AppModule` `@NgModule()` `imports` array to register Angular's `HttpClient` providers globally.
### Use `HttpClient` in the cart service
Now that the `AppModule` imports the `HttpClientModule`, the next step is to inject the `HttpClient` service into your service so your app can fetch data and interact with external APIs and resources.
1. Open `cart.service.ts`.
1. Import `HttpClient` from the `@angular/common/http` package.
1. Inject `HttpClient` into the `CartService` constructor:
### Define the `get()` method
Multiple components can leverage the same service.
Later in this tutorial, the shipping component uses the cart service to retrieve shipping data via HTTP from the `shipping.json` file.
First, define a `get()` method.
1. Continue working in `cart.service.ts`.
1. Below the `clearCart()` method, define a new `getShippingPrices()` method that uses the `HttpClient` `get()` method to retrieve the shipping data.
For more information about Angular's `HttpClient`, see [HttpClient](guide/http "HttpClient guide").
## Define the shipping page
Now that your app can retrieve shipping data, create a shipping component and template.
1. Generate a new component named `shipping`.
Reminder: In the file list, right-click the `app` folder, choose `Angular Generator` and `Component`.
1. In `app.module.ts`, add a route for shipping. Specify a `path` of `shipping` and a component of `ShippingComponent`.
There's no link to the new shipping component yet, but you can see its template in the preview pane by entering the URL its route specifies. The URL has the pattern: `https://getting-started.stackblitz.io/shipping` where the `getting-started.stackblitz.io` part may be different for your StackBlitz project.
1. Modify the shipping component so that it uses the cart service to retrieve shipping data via HTTP from the `shipping.json` file.
1. Import the cart service.
1. Define a `shippingCosts` property.
1. Inject the cart service in the `ShippingComponent` constructor:
1. Set the `shippingCosts` property using the `getShippingPrices()` method from the cart service.
1. Update the shipping component's template to display the shipping types and prices using the `async` pipe:
The `async` pipe returns the latest value from a stream of data and continues to do so for the life of a given component. When Angular destroys that component, the `async` pipe automatically stops. For detailed information about the `async` pipe, see the [AsyncPipe API documentation](/api/common/AsyncPipe).
1. Add a link from the cart page to the shipping page:
1. Test your shipping prices feature:
Click the "Checkout" button to see the updated cart. Remember that changing the app causes the preview to refresh, which empties the cart.
Click on the link to navigate to the shipping prices.
## Next steps
Congratulations! You have an online store application with a product catalog and shopping cart. You can also look up and display shipping prices.
To continue exploring Angular, choose either of the following options:
* [Continue to the "Forms" section](start/forms "Getting Started: Forms") to finish the app by adding the shopping cart page and a checkout form.
* [Skip ahead to the "Deployment" section](start/deployment "Getting Started: Deployment") to move to local development, or deploy your app to Firebase or your own server.