【发布时间】:2021-09-24 15:09:12
【问题描述】:
我正在使用 MVC 在 ASP.NET 核心中开发一个简单的天气仪表板。我已经弄清楚如何将天气 API 调用的 URI 基地址从 appsettings 传递到配置设置,然后再传递到调用天气 API 的接口:
应用设置:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
//Here:
"openWeatherAPI": "https://api.openweathermap.org/",
}
启动配置:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//Here
string uri = Configuration.GetValue<string>("openWeatherAPI");
services.AddControllersWithViews();
services.AddHttpClient<IForecastRepository, ForecastRepository>(c =>
{
//And Here:
c.BaseAddress = new Uri(uri);
}
);
预测界面:
public interface IForecastRepository
{
Task<CityModel> GetMovieDetailsAsync(string cityName);
}
public class ForecastRepository : IForecastRepository
{
private readonly HttpClient _httpClient;
public ForecastRepository(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<CityModel> GetMovieDetailsAsync(string cityName)
{
string IDOWeather = "/*my api key is hardcoded in here*/";
var queryString = $"data/2.5/weather?q={cityName}&units=imperial&APPID={IDOWeather}";
var response = await _httpClient.GetStringAsync(queryString);
//...code conitnues
有没有类似的方法可以传入 API 密钥?据我了解,将其写入我所做的应用程序并不是最佳做法。
关于 HttpClientFactory 的讨论:
天气控制器:
public class WeatherController : Controller
{
private readonly IForecastRepository _forecastRepository;
public WeatherController(IForecastRepository forecastRepository)
{
_forecastRepository = forecastRepository;
}
public IActionResult SearchCity()
{
var viewModel = new CityModel();
return View(viewModel);
}
public IActionResult City()
{
var viewModel = new CityModel();
return View(viewModel);
}
[HttpPost]
public async Task<IActionResult> SearchResults(CityModel titleFromView)
{
var movieDetail = await _forecastRepository.GetMovieDetailsAsync(titleFromView.Name);
return View("City", movieDetail);
【问题讨论】:
-
为什么不能像传入 API URI 那样做呢?可能的优化:使用属性
Uri和ApiKey创建一个类OpenWeatherApiOptions。在启动时从 appsettings 填写它,并将其作为IOptions<OpenWeatherApiOptions>注入到您的预测存储库中 - 详细信息在 @galdin 链接的文档中进行了解释 -
我没看过那个文档,谢谢分享!我迷失在 httpclient/httpclientfactory 文档中,并没有考虑真正阅读我正在工作的更广泛的上下文(即配置)。我最终使用了提供的答案中的建议。配置文档中概述的方法与答案中演示的方法之间是否存在任何既定的偏好?
标签: c# asp.net-core .net-core model-view-controller api-key