Atributos para verbos HTTP
Clase 8 de 22 • Curso de APIs con .NET
Contenido del curso
Clase 8 de 22 • Curso de APIs con .NET
Contenido del curso
Marcos Avila Rodriguez
Miguel Teheran
Mauricio Carrasco
Jose Antonio Diaz Urbano
Luis Covarrubias
Jose Ignacio Hernandez Villafuerte
Marcos Lanuza
Jose Elias Cruz Perez
Platzi Team
Elmer Alexander Gómez Cos
Brandon López Falfán
Edinson Jesús Paternina Rivera
Diego Fernando Pallares Ramirez
Diego Fernando Pallares Ramirez
Charly Johan Manrique Gómez
Esteban Vallejos
Fernando Sanchez
Miguel Teheran
JUAN PABLO MAYORGA MENDIETA
FELIX EVR
Daniel Andrés Pinto Ortega
Cristina Tinoco
Miguel Teheran
Miguel Teheran
Luis Eduardo
Miguel Teheran
JOSE CATAGUA
Miguel Teheran
Juan David Rodriguez Triana
Miguel Teheran
Caffè Latte
Miguel Teheran
José Ángel Soriano Soriano
Miguel Teheran
Alvaro Augusto Perea Ospina
Christian Chancay
Si no quieres usar otra app para probar el api. Te recomiendo la extensión Thunder Client de Ranga Vadhineni. De esta forma solo necesitaras VSCode.
buena alternativa
No conocía esa, pero suena interesante, yo uso REST Client y ya me acostumbré :D
Tengo la sensación de que estoy copiando código sin que me estén explicando del todo qué estoy haciendo. Hay muchas cosas dentro del código que estamos manejando que no se han explicado en los cursos anteriores y en lo que llevamos de este tampoco. A mi parecer todo es demasiado abstracto si nunca has estado ligado al mundo backend.
Otra cosa más es que después de muchos cursos en la ruta de backend con c# y .NET tengo la sensación de que no sería capaz ahora mismo de crear nada que pudiera ser de utilidad en un proyecto o que se parezca mínimamente a un proyecto real. Incluso con los cursos de iniciación recuerdo que me preguntaba bastante "y esto para qué me va a servir?"
Aun no tengo claro si todo el esfuerzo está mereciendo la pena...
PD: en todos los cursos veo muchísima gente en los comentarios comentando cosas avanzadas, como si ya vinieran de otros lenguajes de backend o incluso personas que saben C# y vienen a asentar bases. Entiendo que para ellos les pueda resultar más fácil entender las cosas pero no se si alguien como yo que venía con 0 conocimientos en POO y backend en general le merece mucho la pena
Entiendo tu sentir, yo también pase por lo mismo cuando me adentre al mundo del desarrollo. Y vas a seguir sintiendo que nada de esto es práctico hasta que te enfrentes a un proyecto real, hasta ese momento todas estas clases tendrán sentido. Mi recomendación es que termines la ruta de aprendizaje y luego ya comiences con un proyecto real; tal vez desarrollando algún crud o un blog. Esa sería mi humilde recomendación.
Es verdad
Una forma sencilla para evitar que se introduzca un ID que esté fuera del rango de la lista:
[HttpDelete("{index}")] public IActionResult Delete(int index) { if (ListWeatherForecast.Count < index) { return BadRequest("The given ID is out of bounds."); } ListWeatherForecast.RemoveAt(index); return Ok("Forecast was successfully removed."); }
could you update this line: if (ListWeatherForecast.Count <= index)
Atributos para verbos HTTP
En ***.NET***, puedes usar atributos para especificar qué verbo HTTP se debe usar para un método en un controlador de API. Aquí hay algunos de los atributos más comunes:
HttpGet: Este atributo se usa para indicar que un método en el controlador debe responder a las solicitudes HTTP GET. Por ejemplo, si quieres obtener un recurso, puedes enviar una solicitud GET a la API.HttpPost: Este atributo se usa para indicar que un método en el controlador debe responder a las solicitudes HTTP POST. Por ejemplo, si quieres crear un nuevo recurso, puedes enviar una solicitud POST a la API.HttpPut: Este atributo se usa para indicar que un método en el controlador debe responder a las solicitudes HTTP PUT. Por ejemplo, si quieres actualizar un recurso existente, puedes enviar una solicitud PUT a la API.HttpDelete: Este atributo se usa para indicar que un método en el controlador debe responder a las solicitudes HTTP DELETE. Por ejemplo, si quieres eliminar un recurso existente, puedes enviar una solicitud DELETE a la API.[HttpDelete("{index}")] public IActionResult Delete(int index){ ListWeatherForecast.RemoveAt(index); return Ok(); }
HttpDelete especifica que este método responde a las solicitudes HTTP DELETE. Además, la ruta especificada en el atributo ({index}) indica que la posición del elemento a eliminar se pasa como un parámetro en la URL./api/weatherforecast/3 para eliminar ese elemento.IActionResult) que indica el resultado de la acción que se realizó. En este caso, se devuelve un resultado de acción Ok que indica que la acción se realizó correctamente y no hubo ningún errorPara los que estén utilizando visual studio, en el verbo Get viene creado el método que el instructor creo por aparte y cuando se intenta ingresar datos en postman en teoría se ingresan pero nunca se visualizan, a un inicio pensé que seria por el .ToList(); que utiliza el instructor y en el método que crea por default visual studio viene .ToArray(), los cambie a manera de ponerlos igual e intente insertar y lo mismo en teoría se inserto pero cuando iba a visualizar no aparecían.
Mi solución fue volarme el método que me crea visual studio en el GET y adaptarlo tal cual como lo tiene el instructor.
para que se ubiquen mejor, les dejo esta imagen de referencia.
Asi tendria que quedar.
Si te ocasionó algún conflicto el código a la hora de compilar tu proyecto, quizás se deba al uso de Random:
TemperatureC = Random.Shared.Next(-20, 55),
Random.Shared es exclusivo para .Net 6 y muy posiblemente tengas una versión de net core inferior a la 6.
Para una pronta solución y probar tu ejemplo puedes copiar el siguiente bloque y sustituirlo donde debe:
public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; var random = new Random(); if(ListWeatherForecast == null || !ListWeatherForecast.Any()) { ListWeatherForecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = random.Next(-20, 55), Summary = Summaries[random.Next(Summaries.Length)] }) .ToList(); } }
Donde hemos instanciado un objeto Random a una variable que va a sustituir a .Shared previamente a la asignación de valores de nuestra lista y así evitarnos un error al compilar.
Excelente explicacion, aunque se deberia ahondar mas en los tipos de respuestas de IActionResult
No se si a alguien mas le pase pero, cuando hago Get de primera solo muestra las llaves [], cuando hago el post y luego el Get ahy si muestra información, y el get siempre me vota datos aleatorios y siempre 5, si elimino sale que se ejecuto pero al mirar todos los datos cambiaron y me aparece 5 datos aleatorios nuevamente, y cuando hago post y miro con el get no se me agrega un 6 dato.
ya vi mi error por si ha alguien mas le ha pasado, era porque no estaba negado la condición del if con el sigo !
!ListWeatherForecast.Any()
buena noche, con que teclas se detiene la ejecución en visual studio code ?
Ctrl + C
IActionResult ... Ok(); por que de esa forma ?
IActionResult es una interfaz generica que me permite devolver multiples respuestas http. Ok se devuelve cuando la operación fue exitosa y se puede incluir un cuerpo en el mensaje.
también puedes devolver BadRequest(), NotFound() y este tipo de resultados de acuerdo al escenario e igualmente en el tipo de respuesta seria IActionResult esa es la ventaja de usar esa interfaz generica
Siendo honesto me parece que esta nueva interfaz va muy bien. Sin embargo, me parece que los comentarios deberian seguir llevando una marac de tiempo, con eso sabemos cuanto tiempo aproximadamente lleva el curso. Es un tema de transparencia por parte de platzi, hay cursos muy buenos como este que pueden tener muvha vigencia pero otros muy antiguos que deben ser actualizados. Considero que platzi deber consiente de eso
¿Que hace esta línea de código?:
private readonly ILogger<WeatherForecastController> _logger;
Esta línea declara una propiedad miembro privada llamada _logger. Esta variable es del tipo ILogger<WeatherForecastController>.
El tipo ILogger<T> es una interfaz proporcionada por el framework ASP.NET Core para registrar mensajes de registro (logs) en la aplicación. En este caso, ILogger<WeatherForecastController> indica que esta instancia particular del logger está asociada con la clase WeatherForecastController.
El objetivo principal de tener esta instancia de logger es permitir que el controlador WeatherForecastController registre mensajes de registro (logs) mientras maneja las solicitudes HTTP.
Verbos HTTP:
Get Post Delete Put Patch
Hola. ¿Cuál es la función que cumple el atributo Name? Muchas gracias.
[HttpGet(Name = "GetWeatherForecast")]
Especifica el nombre del endpoint, normalmente es el nombre del método
Permite colocarle un nombre especifico al endpoint al momento de ser llamado
Que significa Ilogger?
la I se utiliza para indicar Interface. respecto al concepto de log o logging puedes revisar esta documentación: https://es.wikipedia.org/wiki/Log_(inform%C3%A1tica)
cuando intento el POST en postman me sale esto en el termmina "Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3] Failed to determine the https port for redirect."
Intenta eliminando este middleware: app.UseHttpsRedirection();
Y también instalando los certificados usando este comando: dotnet dev-certs https --trust
Buenos dias, como puedo tambien recibir en el post un json, en dado caso de que desde una peticion post desde el front vengan varios registros? estuve leyendo y tiene algo que ver con serizalizar la respuesta, como se puede agregar eso en .net?
Debes indicar que vas a mandar un string que incluye el Json, luego puedes usar la librería NewtonSoft.Json o System.Text.Json para realizar al serialización de manera manual. Puedes crear una clase como
public class DataJson { public string Data {get;set;} }
Una pregunta, en la documentación oficial de Microsoft para hacer APIs con Controladores utiliza métodos asíncronos con el async/await y Task, ¿Es recomendado utilizar esto en vez de los métodos síncronos actuales?
Si totalmente, lo ideal siempre usar el async y el await
Al compilarlo en VCode con el comando dotnet run, me genera el sig. erro lo cierro me voy a visual studio no me genera ningun problema...
Compilando... C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 1 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 2 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 4 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 5 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 6 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 7 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 8 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 9 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 10 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): error MSB3027: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se superó el número de 10 reintentos. Error. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): error MSB3021: No se puede copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] PS C:\platzi\webapi> dotnet run Compilando... C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 1 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 2 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 3 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 4 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 5 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 6 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 7 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 8 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 9 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): warning MSB3026: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se iniciará el reintento 10 dentro de 1000ms. The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): error MSB3027: No se pudo copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". Se superó el número de 10 reintentos. Error. [C:\platzi\webapi\webapi.csproj] C:\Program Files\dotnet\sdk\6.0.203\Microsoft.Common.CurrentVersion.targets(5096,5): error MSB3021: No se puede copiar "C:\platzi\webapi\obj\Debug\net6.0\apphost.exe" en "bin\Debug\net6.0\webapi.exe". The process cannot access the file 'C:\platzi\webapi\bin\Debug\net6.0\webapi.exe' because it is being used by another process. [C:\platzi\webapi\webapi.csproj]
No se pudo llevar a cabo la compilación. Corrija los errores de compilación y vuelva a ejecutar el proyecto.
Este error ocurre cuando la aplicación esta amarrada por otro proceso. puede ser que tengas Visual Studio corriendo con la App o que tengas una terminal abierta y no la has cerrado. Si no encuentra donde esta la App ejecutandose entonces puede reiniciar el PC e intentar de nuevo con dotnet run
Para esta clase en especifico, el profesor deberia aclarar que en el controlador "WeatherForecast" el tipo de dato Date es DateOnly.
Deberia aclarar que en el constructor se debe cambiar de DateOnly, a DateTime para no sacar errores.
if(ListWeatherForecast == null || !ListWeatherForecast.Any()) { ListWeatherForecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), // Usamos DateOnly TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToList(); }