Вызовите WeatherAPI с помощью HttpClient

Я создал веб-API для получения ежедневной температуры от OpenWeatherAPI. Я поместил вызов API в проект MVC; (планируйте позже создать новый проект для лучшей архитектуры микросервиса).

Кто-то упомянул в коде:

в вашем HomeController вы пытаетесь просто вызвать действие подобно методу на экземпляре WeatherController. Вам также нужно использовать HttpClient. Кроме того, напрямую не создавайте HttpClient. Его следует рассматривать как одноэлементный

Как бы я это сделал? Это оригинальный код, который начал программировать месяц назад.

MVC Страница:

namespace WeatherPage.Controllers
{
    public class HomeController : Controller
    {

        public WeatherController weathercontroller = new WeatherController();

        public IActionResult Index()
        {
            return View();
        }

        public Async Task<IActionResult> About()
        {
            ViewData["Message"] = "Your application description page.";
            ViewData["test"] =  weathercontroller.City("Seattle");
            return View();
        }
    }
}

Контроллер API:

[Route("api/[controller]")] 
public class WeatherController : ControllerBase
{
    [HttpGet("[action]/{city}")]
    public async Task<IActionResult> City(string city)
    {
        Rootobject rawWeather = new Rootobject();
        using (var client = new HttpClient())
        {
            try
            {
                client.BaseAddress = new Uri("http://api.openweathermap.org");
                var response = await client.GetAsync($"/data/2.5/weather?q={city}&appid=APIkey&units=metric");
                response.EnsureSuccessStatusCode();

                var stringResult = await response.Content.ReadAsStringAsync();
                rawWeather = JsonConvert.DeserializeObject<Rootobject>(stringResult);
                return Ok(rawWeather);
            }
            catch (HttpRequestException httpRequestException)
            {
                return BadRequest($"Error getting weather from OpenWeather: {httpRequestException.Message}");
            }
        }
    }
}   

public class Rootobject
{
    public Coord coord { get; set; }
    public Weather[] weather { get; set; }
    public string _base { get; set; }
    public Main main { get; set; }
    public int visibility { get; set; }
    public Wind wind { get; set; }
    public Clouds clouds { get; set; }
    public int dt { get; set; }
    public Sys sys { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public int cod { get; set; }
}

Это работает в моем проекте: https: // localhost: 55555 / api / weather / city / washington

Извлечение данных из сторонних разработчиков Openweather Api

Должны ли мы звонить веб-Api из приложения Mvc в том же решении

Всего 1 ответ


Это примерно означает, что вы должны использовать инъекцию зависимостей.

  1. Не создавайте экземпляр HttpClient каждый раз, когда вам это нужно, просто попросите экземпляр HttpClient.
  2. Извлеките свой код получения погоды в контроллере погоды в службу и попросите услугу как в контроллере погоды api, так и в домашнем контроллере

WeatherService :

public interface IWeatherService
{
    Task<Rootobject> CityAsync(string city);
}

public class WeatherService : IWeatherService{
    private HttpClient _httpClient ;
    public WeatherService(IHttpClientFactory clientFactory){
        this._httpClient = clientFactory.CreateClient();
    }


    public async Task<Rootobject> CityAsync(string city){
        Rootobject rawWeather = new Rootobject();
        this._httpClient.BaseAddress = new Uri("http://api.openweathermap.org");
        var response = await this._httpClient.GetAsync($"/data/2.5/weather?q={city}&appid=APIkey&units=metric");
        response.EnsureSuccessStatusCode();

        var stringResult = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<Rootobject>(stringResult);
    }

}

Новый WeatherController:

[Route("api/[controller]")] 
public class WeatherController : ControllerBase
{
    private IWeatherService _weatherService;

    public WeatherController(IWeatherService wetherService ){
        this._weatherService= wetherService;
    }

    [HttpGet("[action]/{city}")]
    public async Task<IActionResult> City(string city)
    {
        try
        {
            var rawWeather=await this._weatherService.CityAsync(city);
            return Ok(rawWeather);
        }
        catch (HttpRequestException httpRequestException)
        {
            return BadRequest($"Error getting weather from OpenWeather: {httpRequestException.Message}");
        }
    }
}

Новый HomeController:

public class HomeController : Controller
{
    private IWeatherService _weatherService;
    public HomeController(IWeatherService wetherService ){
        this._weatherService= wetherService;
    }

    public IActionResult Index()
    {
        return View();
    }

    public async Task<IActionResult> About()
    {
        ViewData["Message"] = "Your application description page.";
        ViewData["test"] =  await this._weatherService.CityAsync("Seattle");

        return View();
    }

}

ConfigureServices:

services.AddHttpClient();
services.AddSingleton<IWeatherService ,WeatherService>();

Есть идеи?

10000