我正在学习如何使用第三方API,并想知道我所拥有的是不是实现对API的HTTP请求的好方法。我创建了一个用于向前端显示信息的私有方法,我这样做是为了避免将所有内容都放在GetResult()方法中。有没有更好的方法呢?
更新2
public ActionResult Main()
{
return View();
}
[HttpPost]
public ActionResult GetResult(int zipCode)
{
ApiController api = new ApiController();
var weather = api.GetResult(zipCode);
var tuple = new Tuple<OpenWeatherMap, RootObject>(new OpenWeatherMap(), new RootObject());
return View("Main", tuple);
}
public async Task<Json.RootObject> GetResult(int zipCode)
{
const string apiKey = "";
var client = new HttpClient();
var response = await client.GetAsync("http://api.openweathermap.org/data/2.5/weather?zip=" +
zipCode + ",us&APPID=" + apiKey);
response.EnsureSuccessStatusCode();
var rootObj = new Json.RootObject();
var responseBody = await response.Content.ReadAsStringAsync();
var deserialize = JsonConvert.DeserializeObject<Json.RootObject>(responseBody);
if (response.IsSuccessStatusCode)
{
rootObj.id = deserialize.id;
rootObj.weather[0].description = deserialize.weather[0].description;
}
return rootObj;
}
发布于 2019-05-31 04:05:22
将您对其他系统的请求隐藏在Gateway后面,并将有关外部API的所有血淋淋的细节保存在那里。此外,best practice将为每个应用程序使用一个HttpClient,因为它们有一个设计缺陷,在释放套接字后仍会保留这些套接字。
如果您使用的是dotnet核心,那么使用HttpClientFactory获取一个池化HttpClient的实例
用于在Global.asax中创建HttpClient
public class MvcApplication : System.Web.HttpApplication
{
public static HttpClient HttpClient { get; set; }
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
HttpClient = new HttpClient();
}
protected void Application_End()
{
if (HttpClient == null) return;
HttpClient.Dispose();
}
}
一个简单的实现可能是
public class ExternalGateway
{
private readonly HttpClient _httpClient;
public ExternalGateway(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<SomeModel> GetSomeExternalResource(Uri uri)
{
var response = await _httpClient.GetAsync(uri.AbsoluteUri);
// TODO: check status
// do some conversion of the content to your model
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<SomeModel>(content);
}
}
public class SomeModel
{
public string SomeProperty { get; set; }
}
替换您的模型和您要连接的url。
然后你的控制器就可以保持干净了。
就像这样
var gateway = new ExternalGateway(MvcApplication.HttpClient);
var model = await gateway.GetSomeExternalResource(new Uri("<your complete url>"));
return View(model);
这假设您将在视图中使用强类型模型,而不是ViewBag。
https://stackoverflow.com/questions/56384072
复制相似问题