Api Rest : Creación de un Api Rest CRUD en C# - Parte 1

Qué es un Rest?
Es una arquitectura que se apoya en el estándar HTTP, permite crear aplicaciones y servicios que pueden ser usadas por cualquier dispositivo o cliente que utilice HTTP, algunas alternativas son SOAP y XML.
Los datos obtenidos pueden se XML o Json que suele ser más rápido.

Las operaciones más importantes  en cualquier sistema Rest (CRUD)  son:
  • GET (Leer y consultar los registros)
  • POST (Crear nuevos registros)
  • PUT (Editar y modificar los registros)
  • DELETE (Eliminar los registros)

Las ventajas de usar protocolo Rest es separar totalmente la interfaz de usuario del servidor y el almacenamiento de datos, esto contribuye a una mejora en la portabilidad de la plataforma y un aumento en la escalabilidad, así como aumentar la seguridad del mismo.

Para el ejemplo necesitaremos instalar:
También necesitaremos una base de datos con al menos una tabla que será llamada para realizar la creación, consulta, modificación y eliminación de datos.

 Crearemos un proyecto Web con C#.


Seleccionaremos el template Web Api, así como las casillas MVC y Web Api.



Una vez creado el proyecto anexaremos un nuevo proyecto donde realizaremos la conexión a la base de datos.
Botón derecho sobre el proyecto, Add, New project


El nuevo proyecto será de tipo Visual C# y Class Library (.NET Framework), tecleamos el nombre y seleccionamos la ubicación.


Borramos Class1.cs ya no será necesaria.


Adicionamos una nuevo Ítem en el nuevo proyecto.


El tipo será Visual C#, Data, ADO.NET Entity Data Model, tecleamos el nombre y lo adicionamos.


Seleccionamos EF Designer Form database, Next.


Buscamos nueva base de datos, marcamos la casilla para que guarde la conexión de la base de datos en el archivo app.Config, tecleamos el nombre y presionamos Next.


Seleccionamos Entity Framework 6.x.
 

Seleccionamos la base de datos de la cual utilizaremos los datos., marcamos las casillas Pluralize or singularize generated object names, Include foreign key columns in the model, por último, tecleamos el nombre.


Una vez finalizado se visualizará el diagrama con la tabla de la base de datos donde se indica que nuestro campo primario es  int_id.


Ingresaremos al archivo app.Config, seleccionamos y copiamos la cadena de conexión a la base de datos.


Editamos el archivo web.Config de nuestro proyecto principal y copiamos la cadena de conexión.


En nuestro proyecto principal agregamos una Referencia.


Seleccionamos el nuevo proyecto que creamos donde se encuentra la configuración de la base de datos.


La nueva referencia se adicionará en el apartado References.


En nuestro proyecto principal agregamos un Controller.


Seleccionaremos el tipo Web Api 2 Controller-Empty.


En caso de visualizar el siguiente error.


Seleccionar Build/Rebulid Solution.


Reintenta crear de nuevo el Controller y adicionarlo.


Agregaremos la referencia de la conexión de la base datos y teclearemos la siguiente línea.


Los datos los tomaremos de la referencia donde realizamos la conexión a la base de datos.


Ahora debemos agregar el paquete EntityFramework, seleccionamos nuestro proyecto principal, Manager NuGet Packages


Buscamos el paquete EntityFramework y lo instalamos.


Se agregarán 2 referencia EntityFramework y EntityFramework.SqlServer.


Agregaremos el siguiente código que realizara la consulta de todos los registros de la tabla.


El nombre de la tabla la podemos obtener consultando la referencia de nuestra conexión a la base de datos.


Ejecutaremos nuestra aplicación y seleccionaremos el apartado API.



Podemos visualizar que solo está activo el método GET para realizar una consulta de todos los registros de la tabla.

 
Al editar el método GET podemos visualizar el nombre de los campos que podremos utilizar. 

 

Para poder consultar todos los registros de la tabla, debemos teclear en el navegador adelante del localhost/api/usuarios, se visualizan todos los registros de la tabla en formato XML.


Teclearemos el método GET por registro donde la búsqueda se realizará por el campo int_id.


Teclearemos el método POST para la creación de nuevos registros.


Teclearemos el método PUT para la modificación de registros, en caso de visualizar el siguiente error solo agregaremos la referencia System.Data.Entity.

 
Agregamos el método DELETE.

 
Ejecutamos de nuevo nuestra aplicación, en el apartado Api podemos visualizar todos los métodos activos.


La salida de la información está en formato XML para generarla en formato Json debemos editar el archivo WebApiConfig.cs que se ubica en el proyecto principal.

Teclearemos el siguiente código que realizar la salida en formato Json y remueve la salida en formato XML.


Si realizar la consulta de todos los registros la salida será en formato Json.


Para la prueba final debemos ejecutar Postman

METODO GET (Todos los registros)
Seleccionamos el método GET, tecleamos la URL y presionamos SEND, en la parte inferior (Body) se visualizan todos los registros de la tabla.





















METODO GET (Consulta por registro)
Seleccionamos el método GET, tecleamos la URL agregando al final el no. de registro a consultar, presionamos SEND, en la parte inferior (Body) se visualiza solo el registro seleccionado.


METODO POST (Agregar un nuevo registro)
Seleccionaremos el método POST, Body, Raw y teclearemos los nuevos datos en formato Json, al presionar SEND el nuevo registro se visualizará en la parte inferior.


Para consultar que el registro se haya anexado correctamente se realizar la consulta con el método GET.


METODO PUT (Modificación e un registro)
Seleccionaremos el método PUT, teclearemos la URL indicando el no. de registro a modificar, teclearemos los datos a cambiar en formato Json, al presionar SEND nos enviara un resultado 200.


Para consultar los cambios volveremos a ejecutar un método GET.


METODO DELETE (Eliminar registros)
Seleccionaremos el método DELETE, teclearemos la URL indicando el no. de registros a eliminar, al presionar SEND nos dará un resultado 200 y nos indicara e la parte inferior los datos que fuerón eliminados.


Para verificar que el registro haya sido eliminado realizaremos de nuevo el método GET.


Ahora nuestro Api Rest puede ser utilizado en cualquier aplicación por el método HTTP.

Próximo artículo Api Rest : Consumiendo un Api Rest en C# - Parte 2 .

Puedes consultar el Api: Consultar Api en Json

Publicar un comentario

38 Comentarios

  1. Al realizar la inserción del connectionstring desde app.config, me sucede que ya no aparece el web.config en el proyecto

    ResponderBorrar
  2. Al realizar la insercion del connection string desde App.config, no me aparece el web.config en el proyecto. :/

    ResponderBorrar
  3. ES raro, el archivo web.config no se puede borrar a menos que lo hagan directo en el proyecto, si creas otro proyecto y solo copias el web.config y lo modificas.

    ResponderBorrar
  4. Buenas, luego de finalizar el API como lo exporto para publicarlo en el IIS?

    ResponderBorrar
  5. Hola, la verdad es que me parece muy fascinante esta forma de mostrar resultados con la API, soy nuevo en ASP porque generalmente trabajo con PHP y javascript y nada que ver jajajaja pero desde hace unos días me he estado rompiendo la cabeza con la razón de qué podría estar saliendo mal si estoy siguiendo tus instrucciones al pie de la letra:
    En esta parte:
    "agregaremos el siguiente código que realizara la consulta de todos los registros de la tabla."

    Estoy tratando de imprimir los datos de dbo.DimProduct de la base de datos de pruebas (contoso). Vi que el nombre de tu tabla es UsuariosEntities y ya sustituí dichos valores con el nombre de la tabla DimProduct per sigue marcando error...

    El error dice el tipo usado en luna instrucción using debe convertirse de forma implícita en System.IDisposible...

    A qué se podría deber esto?

    De antemano, muchas gracias, te deberé un café...

    ResponderBorrar
  6. Es raro el error que te da, iDisposible es un error de memoria, cuantos registros tiene tu tabla?, anexaste las referencia?

    Saludos

    ResponderBorrar
  7. Se puede crear un método get que retorne un registro en base a un nombre ingresado?
    Por ej: api/Usuarios/nombre

    ResponderBorrar
  8. Hola, muchas gracias por el tuto, está muy bueno!!... Tengo una consulta, siempre que consulto información por GET, me antepone el atributo ID, hay forma de retirarlo del resultado?,

    Gracias!!.

    ResponderBorrar
    Respuestas
    1. el ID es el campo con que se hace el filtro, en caso de retirarlo tendrás que tener otro campo como índice.

      Borrar
  9. Hola, muchas gracias por tu tutorial, está muy interesante!.. Tengo una consulta, hay forma de retirar el atributo "id" de los resultados?, aparece en todas las respuestas que obtengo mediante el GET.

    Gracias!

    ResponderBorrar
    Respuestas
    1. el ID es el campo con que se hace el filtro, en caso de retirarlo tendrás que tener otro campo como índice.

      Borrar
  10. Buenas tardes, muchas gracias por el tutorial, esta muy completo, tengo una duda sobre como tratar el Entity Data Model, por ejemplo si este usuario tiene relación con una tabla donde están los Puestos y están relacionadas por medio de una llave foranéa, esta tabla de Puestos va en otro Entity Data Model o van en el mismo? y si todo el Entidad Relación va en el mismo Entity Data Model o si cada tabla es uno diferente.

    Ya realice todo el tutorial y me funciono pero al momento de agregar las tablas relacionadas me da el error, muchas gracias.

    ResponderBorrar
    Respuestas
    1. Buenas tardes, hice 2 pruebas, cada una de las tablas son un Entity Model pero cuando quiero agregar un dropdownlist en la vista no me deja, y cuando lo agrego todo en el mismo Entity me sale error en el array, mi duda es si agrego todo en un solo Entity o si cada tabla es uno distinto.

      Muchas gracias.

      {
      "Message": "Error.",
      "ExceptionMessage": "El tipo 'ObjectContent`1' no pudo serializar el cuerpo de respuesta para el tipo de contenido 'application/json; charset=utf-8'.",
      "ExceptionType": "System.InvalidOperationException",
      "StackTrace": null,
      "InnerException": {
      "Message": "Error.",

      Borrar
  11. Hola buena tarde, realice el ejercicio, pero no me muestra nada de información, de la tabla enlazada en el model, solo me muestra el apartado Acount (API) values (API), uso Visual Studio 2015 me podrían dar una mano

    ResponderBorrar
    Respuestas
    1. Agregaste datos a tu tabla? esta correcta la cadena de conexión?

      Borrar
  12. Hola buena tarde, me podrias ayudar, realize el ejercio se ejecuta y todo, pero al momento de seleccionar API no me despliega la pantalla que tu muestras, donde se puede ver la información de la tabla clientes, estoy manejando VS 2015. Espero me puedas ayudar.

    ResponderBorrar
    Respuestas
    1. Agregaste datos a tu tabla? esta correcta la cadena de conexión?

      Borrar
  13. Cuando lo publico en iis simplemente no logro hacer que funcione, mientras que en visual studio funcioa perfectamente, a que se debe esto???

    ResponderBorrar
  14. Amigo, cuando creo el ado.NET y hago referencia a mi base de datos local, no me genera el diagrama ni la entidad, ya que a la hora de hacerle GET me saca error el Usuarios. Ya que no existe en ConectarDatos

    ResponderBorrar
  15. Hola en el caso de publicar la API por https y no por http como se debe hacer? y si estoy usando base de datos con SQL Server en vez de Entity framework? Por otro lado como se puede añadir autenticación para usar la API ?

    ResponderBorrar
    Respuestas
    1. Para publicar con https instalas el certificado SSL y posteriormente hace la publicación de la api en forma normal, si usas sql server crear la conexión en app.config y llamas la cadena en el web.config

      Borrar
    2. Para la autenticación, se pueden usar servicios de token y darles validez. Por cierto muy buen contenido tu blog y muy graficas tus explicaciones. Felictaciones por tu contenido!

      Borrar
  16. Hola, esta buenisimo este tuto. Sin embargo tengo una duda, al momento de querer poner "dbContext" me marca el error CS0103. ¿Tengo agregar un paso?
    Espero que puedas responder pronto.Y muchas gracias por este gran tutorial.Me ha ayudado mucho

    ResponderBorrar
  17. Buenas, excelente manual me salio tal cual a mi tabla de usaurios, todo perfecto. Consulta si no deseo usar entity framework y usar los select o procedure del al bb como sql, como creos mis modelos, y como serian si ya no usarioa el dbcontext??. Gracias..

    ResponderBorrar
  18. Y como se puede hacer para agregarle autenticacion por medio de token?

    ResponderBorrar
  19. Excelente tutorial, yo utilice visual Studio 2019 y me costo un poco mas de trabajo ya que no se aplican al 100 los pasos.

    Pero con tú tutorial por fin pude entender lo que es una API rest y como funciona.
    Muchas gracias, como comentario final los pasos a seguir son muy claros y entendibles.

    ResponderBorrar
  20. en la parte de agregar la base de datos no logro hacer que la bd muestre la tabla usuarios por lo que al finalizar el preoceso, no me aparece el diagrama con la tabla usuario, viene como vacio, no sé...
    La bd si muestra la tabla en su info e incluso cuenta con un registro, pero cuando intento hacer los get o los posts desde postman, me arroja error y pareciera que la tabla no existe o algo así

    Por un lado, recibo este error desde visual studio o al hacer get desde postman:
    Error 2062: No se ha especificado ninguna asignación para las instancias de EntitySet y AssociationSet en el EntityContainer UsuariosEntities.

    Y este desde postman:
    error 500 internal server error
    "Message": "Error.",
    "ExceptionMessage": "Schema specified is not valid. Errors: \r\nUsuariosDatosModel.msl(3,4) : error 2062: No mapping specified for instances of the EntitySet and AssociationSet in the EntityContainer UsuariosEntities.",
    "ExceptionType": "System.Data.Entity.Core.MappingException"

    Ojala pudieras ayudarme a ver que puede ser...

    ResponderBorrar
    Respuestas
    1. Logré arreglar el tema de la base de datos no cargando el diagrama, por lo que las entidades no se relacionaban...
      La solucion es ir al diagrama de UsuariosFDatos.edmx y en donde está vacio, dar click derecho>Actualizar modelo desde base de datos y ahi si aparecerá la base de datos con la tabla usuarios como en la imagen, seleccionan los 3 cuadros como enb la imagen y de dan continuar hasta finalizar.
      Voilá, el diagrama y sus respectivas relaciones listas

      Borrar
    2. Muchas gracias, lo tomare en cuenta.

      Borrar
  21. Hola, gracias por la informacion, estoy trabajando en xamarin android y webservice para obtener informacion de mi base de datos sql y tu manual me sirvio de mucho, asi mismo indicarte que yo uso procedimientos almacenados para listar informacion de la base de datos mediante el webservice, sera posible grabar/actualizar informacion por webservice usando store procedure. Saludos

    ResponderBorrar
    Respuestas
    1. Si es posible, estoy creando un post para .Net 5 donde muestro como realizar un CRUD con Stored Procedure, en breve lo pondré público.

      Borrar
  22. excelente ejemplo, podrian subir el código, es que hay imagenes que no se ven

    ResponderBorrar