Jak spożywać webApi z asp.net Web API do przechowywania wyników w bazie danych?

Zastanawiam się jak zjeść WEBAPI z innego ASP.Net Web API do przechowywania odpowiedzi w bazie danych. Wiem jak korzystać z WEBAPI z takich klientów jak javascript,aplikacja konsolowa itp.

Ale wymaganiem jest pobranie danych z zewnętrznego API Przez my WEBAPI i zapisanie wyniku w bazie danych, aby za pomocą mojego WEBAPI moi klienci prosili mnie o dane.

Czy można to zrobić z Asp.Net Web API?

Author: Jonathan, 2013-10-18

3 answers

W tym samouczku wyjaśniono, jak korzystać z web api W C#, w tym przykładzie używana jest aplikacja konsolowa, ale możesz również użyć innego Web api, aby oczywiście korzystać.

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

Powinieneś rzucić okiem na HttpClient

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

Upewnij się, że Twoje prośby proszą o odpowiedź w JSON, używając nagłówka Accept w następujący sposób:

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

Teraz pochodzi część, która różni się od samouczka, upewnij się, że masz te same obiekty co inne WEB API, Jeśli nie, to musisz mapować obiekty do własnych obiektów. ASP.NET przekonwertuje JSON otrzymany obiekt na obiekt, którym ma być.

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
}

Proszę zauważyć, że używam .Result dla przykładu. Należy rozważyć użycie async await wzór tutaj.

 92
Author: Nick N.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-20 07:57:06

Z jakiegoś niewyjaśnionego powodu To rozwiązanie nie działa dla mnie( może jakaś niezgodność typów), więc wymyśliłem rozwiązanie dla siebie:

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

W ten sposób Moja zawartość jest przetwarzana na łańcuch JSON, a następnie konwertuję ją na mój obiekt.

 9
Author: MalachiteBR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-10 15:56:08
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);
    }
} 

Wytrwałość

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

Repozytorium

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
Author: Srinivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 17:31:22