【问题标题】:Call WeatherAPI with HttpClient使用 HttpClient 调用 Wea​​therAPI
【发布时间】:2018-09-28 04:33:08
【问题描述】:

我创建了 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

Retrieve Data From Third party Openweather Api

Should We Call Web Api from Mvc Application in Same Solution

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc asp.net-core-webapi dotnet-httpclient


    【解决方案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();
        }
    
    }
    

    配置服务:

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

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2016-06-11
      相关资源
      最近更新 更多