Cómo consumir un API Rest como clientes con C#


Hoy vamos a ver cómo consumir un API Rest desde una aplicación escrita en .Net Framework, sin necesidad de librerías de terceros.

Como sabemos, proporcionar un API Rest es una forma común de comunicación con aplicaciones Web. Por tanto, es frecuente que tengamos que interactuar con ellas desde nuestra aplicación.

Afortunadamente, comunicarnos con un API Rest desde una aplicación en .Net es sencillo con la clase HttpWebRequest, incluida por defecto.

Para esta entrada emplearemos nuestro API Rest de ejemplo en NodeJS que vimos en esta entrada, y hemos usado frecuentemente en el blog como base de un API Rest "bien" estructurado.

Para consumir nuestro API Rest de ejemplo desde .Net vamos a crear una aplicación de ejemplo. Una aplicación de consola, por ejemplo, será suficiente.

Dentro sustituimos el método main por nuestra prueba del API Rest, con las funciones que prueban las distintas funcionalidades.

static void Main(string[] args)
{
	GetItem(10);
	GetItems();
	GetItems("ABC");
	PostItem("NewItem");
	PutItem(4, "ReplaceItem");
	DeleteItem(5);
}

Ahora, la definición de estas funciones podría ser la siguiente.

private static void GetItem(int id)
{
	var url = $"http://localhost:8080/item/{id}";
	var request = (HttpWebRequest)WebRequest.Create(url);
	request.Method = "GET";
	request.ContentType = "application/json";
	request.Accept = "application/json";

	try
	{
		using (WebResponse response = request.GetResponse())
		{
			using (Stream strReader = response.GetResponseStream())
			{
				if (strReader == null) return;
				using (StreamReader objReader = new StreamReader(strReader))
				{
					string responseBody = objReader.ReadToEnd();
					// Do something with responseBody
					Console.WriteLine(responseBody);
				}
			}
		}
	}
	catch (WebException ex)
	{
		// Handle error
	}
}

private static void GetItems()
{
	var url = $"http://localhost:8080/items";
	var request = (HttpWebRequest)WebRequest.Create(url);
	request.Method = "GET";
	request.ContentType = "application/json";
	request.Accept = "application/json";

	try
	{
		using (WebResponse response = request.GetResponse())
		{
			using (Stream strReader = response.GetResponseStream())
			{
				if (strReader == null) return;
				using (StreamReader objReader = new StreamReader(strReader))
				{
					string responseBody = objReader.ReadToEnd();
					// Do something with responseBody
					Console.WriteLine(responseBody);
				}
			}
		}
	}
	catch (WebException ex)
	{
		// Handle error
	}
}

private static void GetItems(string filter)
{
	var url = $"http://localhost:8080/items?filter={filter}";
	var request = (HttpWebRequest)WebRequest.Create(url);
	request.Method = "GET";
	request.ContentType = "application/json";
	request.Accept = "application/json";

	try
	{
		using (WebResponse response = request.GetResponse())
		{
			using (Stream strReader = response.GetResponseStream())
			{
				if (strReader == null) return;
				using (StreamReader objReader = new StreamReader(strReader))
				{
					string responseBody = objReader.ReadToEnd();
					// Do something with responseBody
					Console.WriteLine(responseBody);
				}
			}
		}
	}
	catch (WebException ex)
	{
		// Handle error
	}
}

private static void PostItem(string data)
{
	var url = $"http://localhost:8080/items";
	var request = (HttpWebRequest)WebRequest.Create(url);
	string json = $"{{\"data\":\"{data}\"}}";
	request.Method = "POST";
	request.ContentType = "application/json";
	request.Accept = "application/json";

	using (var streamWriter = new StreamWriter(request.GetRequestStream()))
	{
		streamWriter.Write(json);
		streamWriter.Flush();
		streamWriter.Close();
	}

	try
	{
		using (WebResponse response = request.GetResponse())
		{
			using (Stream strReader = response.GetResponseStream())
			{
				if (strReader == null) return;
				using (StreamReader objReader = new StreamReader(strReader))
				{
					string responseBody = objReader.ReadToEnd();
					// Do something with responseBody
					Console.WriteLine(responseBody);
				}
			}
		}
	}
	catch (WebException ex)
	{
		// Handle error
	}
}

private static void PutItem(int id, string data)
{
	var url = $"http://localhost:8080/items";
	var request = (HttpWebRequest)WebRequest.Create(url);
	string json = $"{{\"id\":\"{id}\",\"data\":\"{data}\"}}";
	request.Method = "PUT";
	request.ContentType = "application/json";
	request.Accept = "application/json";

	using (var streamWriter = new StreamWriter(request.GetRequestStream()))
	{
		streamWriter.Write(json);
		streamWriter.Flush();
		streamWriter.Close();
	}

	try
	{
		using (WebResponse response = request.GetResponse())
		{
			using (Stream strReader = response.GetResponseStream())
			{
				if (strReader == null) return;
				using (StreamReader objReader = new StreamReader(strReader))
				{
					string responseBody = objReader.ReadToEnd();
					// Do something with responseBody
					Console.WriteLine(responseBody);
				}
			}
		}
	}
	catch (WebException ex)
	{
		// Handle error
	}
}

private static void DeleteItem(int id)
{
	var url = $"http://localhost:8080/items/{id}";
	var request = (HttpWebRequest)WebRequest.Create(url);
	request.Method = "DELETE";
	request.ContentType = "application/json";
	request.Accept = "application/json";

	try
	{
		using (WebResponse response = request.GetResponse())
		{
			using (Stream strReader = response.GetResponseStream())
			{
				if (strReader == null) return;
				using (StreamReader objReader = new StreamReader(strReader))
				{
					string responseBody = objReader.ReadToEnd();
					// Do something with responseBody
					Console.WriteLine(responseBody);
				}
			}
		}
	}
	catch (WebException ex)
	{
		// Handle error
	}
}

Por supuesto, si ejecutamos este sencillo ejemplo veremos que recibimos correctamente las llamadas de nuestro API Rest simulada.

Como vemos el código, sin ser especialmente difícil, es algo engorroso y repetitivo. En la próxima entrada veremos cómo consumir un API Rest de forma más sencilla gracias a la librería RestSharp.  

4.4 14 votes
Article Rating
Previous Cómo funciona la cinemática de una impresora 3D FFF
Next Cómo usar Arduino y el IMU 9 ejes L3GD20 + LSM303D
1 Comment
oldest
newest
Inline Feedbacks
View all comments
Hector
5 months ago

Hola, muchas gracias por tu aporte. Te Consulto, como hago para enviar un TOKEN de autenticación ?