Позвоните в WeatherAPI с помощью HttpClient - PullRequest
0 голосов
/ 28 сентября 2018

Я создал Web 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

Извлечение данных из стороннего API Openweather

Если мы позвоним в ИнтернетAPI от Mvc Применение в том же решении

1 Ответ

0 голосов
/ 28 сентября 2018

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

  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>();
...