Cómo llamar a REST API y SOAP Serrvice (WCF, ASMX) desde un Minimal API en .NET 6?

60 views
Skip to first unread message

Carlos Admirador

unread,
Jul 5, 2022, 2:56:16 PM7/5/22
to AltNet-Hispano
Tengo un Minimal API en .NET 6.
Para cierta funcionalidad, cómo invocar a un REST API y a un SOAP Serrvice (WCF, ASMX)  desde el minimal api?

Carlos Admirador

unread,
Aug 29, 2022, 5:03:06 AM8/29/22
to AltNet-Hispano

Qué buenas prácticas seguir para llamar a un API desde .NET 6 (sea desde Blazor, aplicación de consola, u otro REST API)?

1) Crear HttpClient en cada llamada ??
2) ConfigureAwait(false).GetAwaiter().GetResult();
3) Algo a tener en cuenta?

public string EnviarSMS(string accessToken, string Origen, string Texto, string Movil, DateTime Fecha)
        {
            ErrorMessage = "";
                        
            var json = new
            {
                Origen = Origen,
                Texto = Texto,
                Movil = Movil,
                Fecha = Fecha.ToString("yyyy-MM-dd") + "T" + Fecha.ToString("HH:mm:ss")
            };

            var jsonString = JsonConvert.SerializeObject(json);

            HttpClient httpClient = new HttpClient();            
            httpClient.BaseAddress = Uri;
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            var response = httpClient.PostAsync("SMS", new StringContent(jsonString, Encoding.UTF8, "application/json"))
                           .ConfigureAwait(false).GetAwaiter().GetResult();

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                SMSResponse smsResponse = response.Content.ReadFromJsonAsync<SMSResponse>().ConfigureAwait(false).GetAwaiter().GetResult();

                if (smsResponse.Codigo == "0")
                    return smsResponse.Info;
                else
                {
                    ErrorMessage = smsResponse.Info;
                    return string.Empty;
                }
            }
            else
            {
                string stringResponse = $"{Uri} " + response.Content.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult();
                ErrorMessage = "ERROR: " + stringResponse;
                return string.Empty;
            }            
        }


Carlos Admirador

unread,
Aug 29, 2022, 5:08:58 AM8/29/22
to AltNet-Hispano
Uso de abstracción ApiProvider:

 public class ApiProvider: IApiProvider
    {
        #region InterfaceMethods
        public async Task<HttpResponseMessage> MakeRequest(HttpClient client, HttpMethod httpMethod, string url, Dictionary<string, string> header = null, Dictionary<string, string> body = null)
       { 
          // omitted
       }

       public async Task<string> GetStringResponse(HttpResponseMessage response)
        {
            string stringResponse = await response.Content.ReadAsStringAsync();
            return stringResponse;
        }

        public async Task<T> GetJsonResponse<T>(HttpResponseMessage response)
        {
            string stringResponse = await GetStringResponse(response);
            JObject jsonResponse = JObject.Parse(stringResponse);
            return JsonConvert.DeserializeObject<T>(jsonResponse.ToString());
        }
        #endregion InterfaceMethods

         #region PrivateMethods
         private string GetContentType(Dictionary<string, string> header)
         private HttpRequestMessage CreateRequest(HttpMethod httpMethod, string url, Dictionary<string, string> header, Dictionary<string, string> body)
         #endregion PrivateMethods
}


Uso:

 public async Task<OrdenWK> SolicitarWK(string accessToken, int IDUsuario)
        {
            try
            {
                ErrorMessage = "";

                Dictionary<string, string> header = new()
                {
                    { "Content-Type", "application/json" },
                    { "Authorization", $"Bearer {accessToken}" }
                };

                string url = ParametrosGlobales.UriTorreControl + "/repartidorwks/" + IDUsuario;
                HttpResponseMessage response = await _apiProvider.MakeRequest(_httpClient, HttpMethod.Get, url, header);
               
                if(!ErrorResponse(response))
                {
                    OrdenWK orden = await _apiProvider.GetJsonResponse<OrdenWK>(response);
                    return orden;
                }

                return null;
            }
            catch(Exception ex)
            {
                ErrorMessage = ex.Message;
                return null;
            }
           
        }


Carlos Admirador

unread,
Aug 30, 2022, 7:12:57 AM8/30/22
to AltNet-Hispano

Carlos Admirador

unread,
Aug 31, 2022, 4:17:00 AM8/31/22
to AltNet-Hispano
Reply all
Reply to author
Forward
0 new messages