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]);
}
}