He de decir que nunca me había planteado usar librerías HTTP para hacer una llamada REST desde mí código en C#. Simplemente uso HttpClient y luego serializo el resultado con Newtonsoft, nada del otro mundo. La autenticación, parámetros o cuerpo de la petición, la monto a mano y listos. Hasta el día de hoy (en el momento de escribir esta entrada para el blog) no conocía librerías para hacer esto, ni interés que tenia. Pero entonces, me ha llamado un compañero de trabajo para ver si podía darle mi opinión sobre un tema y mientras mirábamos el código, he visto una clase llamada RestClient. -Eso no es estándar de .Net- he pensado, así que me he puesto a indagar. Y lo que he visto me ha parecido interesante y por eso he indagado un poco y me he puesto ha hacer unas pruebas básicas, para ver si compensa o no usar librerías para realizar llamadas HTTP.
Básicamente lo que he hecho ha sido crear un proyecto de API REST básico (el de la plantilla de .Net 6), he creado otro proyecto en el que llamo a esta API, todo en localhost y finalmente he medido el resultado de estas llamadas con BenchmarkDotNet.
Sin librerías: Usando HttpClient
La primera prueba ha sido una llamada típica sin usar ninguna librería externa a .NET, así que el código es simplemente instanciar un HttpClient, y deserializar el resultado en una entidad. Para deserializar he usado Newtonsoft, ya que quiero que sea lo mas parecido a lo que haría normalmente. La cosa queda tal que así:
public class HttpClientTest
{
static readonly HttpClient client = new HttpClient();
public async Task<WeatherResponse> CallHttpTest()
{
HttpResponseMessage response = await client.GetAsync($"https://localhost:7149/weatherforecast");
string responseBody = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<WeatherResponse>(responseBody);
}
}
Todo sencillito, sin autenticación y un GET sencillito.
Por supuesto esta es la forma mas optima de llamar, tanto en velocidad como en memoria, luego veremos los resultados, pero te tienes que montar todo a mano: parámetros, autenticación, headers…
Vamos a ver como hago la misma llamada usando librerías para finalmente ver el rendimiento de cada una de las llamadas.
Librería API REST RestSharp
Esta librería, que puedes encontrar aquí y que se auto-denomina como la que probablemente sea la librería REST API mas popular en .Net, nos facilita ligeramente las cosas cuando queremos que la llamada tenga autenticación, cuando queremos enviar body, etc…
La verdad es que solo por eso ya merece la pena usar una librería. El código para la misma llamada.
Instalamos el nuget y picamos la llamada, todo muy sencillito:
public class RestSharpTest
{
public async Task<WeatherResponse> CallRestSharpTest()
{
var client = new RestClient($"https://localhost:7149/weatherforecast");
var request = new RestRequest();
return await client.GetAsync<WeatherResponse>(request);
}
}
Incluso en un ejemplo tan sencillo, ya podemos ver como usar librerías nos libera de tareas como la de deserializar, ya que la llamada nos devuelve directamente la entidad.
El único punto negativo, como veremos en los resultado mas adelante, es que esta librería es un poco «mas pesada» que llamar «a pelo». Aunque si no estas en un entorno de altísimo rendimiento donde unos milisegundos importen, esto tampoco tendría que ser un problema.
Librería HTTP Flur
Con Flur he de deciros que ha sido amor a primera vista. Os pongo el código de lo que sería la llamada:
public class FlurTest
{
public async Task<WeatherResponse> CallFlurTest()
{
return await "https://localhost:7149/"
.AppendPathSegment("weatherforecast")
.GetAsync()
.ReceiveJson<WeatherResponse>();
}
}
Este lenguaje tan natural, y esta forma tan sencilla de ser usado… ¡me encanta!
Además, apenas se nota en el rendimiento o memora la diferencia entre usar Flur o una llamada «a pelo». Y luego, además, tiene esto:
Para mí, Flur es la librería HTTP ganadora 😀
Resultados de rendimiento
Finalmente, vamos a ver los números en la comparativa que nos saca el Benchmark:
Se puede apreciar lo que os comentaba anteriormente, que la llamada con Flur es casi idéntica a la llamada directa sin librerías HTTP y que RestSharp es algo más pesada que el resto.