web-dev-qa-db-fra.com

Comment utiliser une webApi de l'API Web asp.net pour stocker le résultat dans une base de données?

Je me demande comment utiliser une WEBAPI d'une autre API Web ASP.Net pour stocker la réponse dans une base de données. Je sais comment utiliser une WEBAPI de clients tels que javascript, une application console, etc.

Mais l’exigence est d’extraire les données de l’API tierce par mon WEBAPI et de stocker le résultat dans une base de données afin que, en utilisant mon WEBAPI, mes clients me demandent des données.

Est-il possible de faire cela avec une API Web Asp.Net?

47
Karthik Dheeraj

Ce tutoriel explique comment utiliser une API Web avec C #. Dans cet exemple, une application console est utilisée, mais vous pouvez également utiliser une autre web api à consommer bien sûr.

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

Vous devriez jeter un oeil sur le HttpClient

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

Assurez-vous que vos demandes demandent la réponse en JSON en utilisant l'en-tête Accept comme ceci:

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

Maintenant, la partie qui diffère du tutoriel, assurez-vous que vous avez les mêmes objets que l'autre WEB API _ sinon, vous devez mapper les objets sur vos propres objets. ASP.NET convertira le JSON que vous recevez en l’objet que vous souhaitez.

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
}

veuillez noter que j'utilise .Result pour le cas de l'exemple. Vous devriez envisager d'utiliser le modèle asyncawait ici.

92
Nick N.

Pour une raison inexpliquée, cette solution ne fonctionne pas pour moi (peut-être une incompatibilité de types), alors je me suis proposé une solution:

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

De cette façon, mon contenu est analysé dans une chaîne JSON, puis je le convertis en objet.

9
MalachiteBR
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);
    }
} 

Persistance

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

Dépôt

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