visual studio example ejemplo crear consumir c# asp.net asp.net-web-api

studio - web api rest c#



¿Cómo consumir un webApi de asp.net Web API para almacenar el resultado en la base de datos? (3)

Me pregunto cómo consumir una WEBAPI de otra API web ASP.Net para almacenar la respuesta en una base de datos. Sé cómo consumir un WEBAPI de clientes como javascript, aplicaciones de consola, etc.

Pero el requisito es extraer los datos de la API de terceros mediante mi WEBAPI y almacenar el resultado en una base de datos para que, al usar mi WEBAPI, mis clientes me pidan datos.

¿Es posible hacer esto con Asp.Net Web API?


En este tutorial se explica cómo consumir una API web con C #, en este ejemplo se usa una aplicación de consola, pero también puede usar otra API web para consumir, por supuesto.

http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

Deberías echarle un vistazo al HttpClient

HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost/yourwebapi");

Asegúrese de que sus solicitudes soliciten la respuesta en JSON utilizando el encabezado Aceptar de esta manera:

client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));

Ahora viene la parte que difiere del tutorial, asegúrese de tener los mismos objetos que la otra WEB API , de lo contrario, debe asignar los objetos a sus propios objetos. ASP.NET convertirá el JSON que recibe al objeto que desea que sea.

HttpResponseMessage response = client.GetAsync("api/yourcustomobjects").Result; if (response.IsSuccessStatusCode) { var yourcustomobjects = response.Content.ReadAsAsync<IEnumerable<YourCustomObject>>().Result; foreach (var x in yourcustomobjects) { //Call your store method and pass in your own object SaveCustomObjectToDB(x); } } else { //Something has gone wrong, handle it here }

tenga en cuenta que utilizo .Result para el caso del ejemplo. Debería considerar usar el patrón de await async aquí.


Por alguna razón no explicada, esta solución no funciona para mí (tal vez alguna incompatibilidad de tipos), así que se me ocurrió una solución:

HttpResponseMessage response = await client.GetAsync("api/yourcustomobjects"); if (response.IsSuccessStatusCode) { var data = await response.Content.ReadAsStringAsync(); var product = JsonConvert.DeserializeObject<Product>(data); }

De esta forma, mi contenido se analiza en una cadena JSON y luego lo convierto en mi objeto.


public class EmployeeApiController : ApiController { private readonly IEmployee _employeeRepositary; public EmployeeApiController() { _employeeRepositary = new EmployeeRepositary(); } public async Task<HttpResponseMessage> Create(EmployeeModel Employee) { var returnStatus = await _employeeRepositary.Create(Employee); return Request.CreateResponse(HttpStatusCode.OK, returnStatus); } }

Persistencia

public async Task<ResponseStatusViewModel> Create(EmployeeModel Employee) { var responseStatusViewModel = new ResponseStatusViewModel(); var connection = new SqlConnection(EmployeeConfig.EmployeeConnectionString); var command = new SqlCommand("usp_CreateEmployee", connection); command.CommandType = CommandType.StoredProcedure; var pEmployeeName = new SqlParameter("@EmployeeName", SqlDbType.VarChar, 50); pEmployeeName.Value = Employee.EmployeeName; command.Parameters.Add(pEmployeeName); try { await connection.OpenAsync(); await command.ExecuteNonQueryAsync(); command.Dispose(); connection.Dispose(); } catch (Exception ex) { throw ex; } return responseStatusViewModel; }

Repositorio

Task<ResponseStatusViewModel> Create(EmployeeModel Employee); public class EmployeeConfig { public static string EmployeeConnectionString; private const string EmployeeConnectionStringKey = "EmployeeConnectionString"; public static void InitializeConfig() { EmployeeConnectionString = GetConnectionStringValue(EmployeeConnectionStringKey); } private static string GetConnectionStringValue(string connectionStringName) { return Convert.ToString(ConfigurationManager.ConnectionStrings[connectionStringName]); } }