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