Configuración inicial
Antes de comenzar, asegurarse de haber configurado el HttpClientModule y de tener un servicio para interactuar con la API. Si no lo has hecho, revisa el contenido anterior sobre Peticiones HTTP en Angular (REST).
Creación de un servicio para manejar POST y PUT
Vamos a extender el servicio que creamos previamente (product.service.ts) para incluir métodos para agregar y actualizar productos.
// product.service.ts
createProduct(product: Product): Observable<Product> {
return this.http.post<Product>(this.apiUrl, product).pipe(
catchError(this.handleError)
);
}
// product.service.ts
updateProduct(id: number, product: Product): Observable<Product> {
return this.http.put<Product>(`${this.apiUrl}/${id}`, product).pipe(
catchError(this.handleError)
);
}
Uso de POST y PUT en componentes
Ahora que tenemos los métodos en nuestro servicio, vamos a implementar la lógica para utilizarlos en un componente.
ng generate component components/product-add
import { Component } from '@angular/core';
import { ProductService } from '../services/product.service';
import { Product } from '../services/product.service';
@Component({
selector: 'app-product-add',
template: `
<h2>Agregar Producto</h2>
<form (ngSubmit)="onSubmit()">
<label for="name">Nombre:</label>
<input type="text" id="name" [(ngModel)]="product.name" name="name" required>
<label for="description">Descripción:</label>
<textarea id="description" [(ngModel)]="product.description" name="description" required></textarea>
<label for="price">Precio:</label>
<input type="number" id="price" [(ngModel)]="product.price" name="price" required>
<button type="submit">Agregar</button>
</form>
`
})
export class ProductAddComponent {
product: Product = { id: 0, name: '', description: '', price: 0 };
constructor(private productService: ProductService) {}
onSubmit() {
this.productService.createProduct(this.product).subscribe({
next: (data) => {
console.log('Producto agregado:', data);
// Aquí puedes agregar lógica para redirigir o mostrar un mensaje
},
error: (err) => {
console.error('Error al agregar producto:', err);
}
});
}
}
ng generate component components/product-edit
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { ProductService } from '../services/product.service';
import { Product } from '../services/product.service';
@Component({
selector: 'app-product-edit',
template: `
<h2>Editar Producto</h2>
<form (ngSubmit)="onSubmit()">
<label for="name">Nombre:</label>
<input type="text" id="name" [(ngModel)]="product.name" name="name" required>
<label for="description">Descripción:</label>
<textarea id="description" [(ngModel)]="product.description" name="description" required></textarea>
<label for="price">Precio:</label>
<input type="number" id="price" [(ngModel)]="product.price" name="price" required>
<button type="submit">Actualizar</button>
</form>
`
})
export class ProductEditComponent implements OnInit {
product!: Product;
constructor(
private productService: ProductService,
private route: ActivatedRoute
) {}
ngOnInit() {
const id = +this.route.snapshot.paramMap.get('id')!;
this.productService.getProductById(id).subscribe(data => {
this.product = data;
});
}
onSubmit() {
const id = this.product.id;
this.productService.updateProduct(id, this.product).subscribe({
next: (data) => {
console.log('Producto actualizado:', data);
// Aquí puedes agregar lógica para redirigir o mostrar un mensaje
},
error: (err) => {
console.error('Error al actualizar producto:', err);
}
});
}
}