首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这是实现对api的http请求的好方法吗?

这是实现对api的http请求的好方法吗?
EN

Stack Overflow用户
提问于 2019-05-31 02:53:48
回答 1查看 136关注 0票数 1

我正在学习如何使用第三方API,并想知道我所拥有的是不是实现对API的HTTP请求的好方法。我创建了一个用于向前端显示信息的私有方法,我这样做是为了避免将所有内容都放在GetResult()方法中。有没有更好的方法呢?

更新2

代码语言:javascript
复制
  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;
        }
EN

回答 1

Stack Overflow用户

发布于 2019-05-31 04:05:22

将您对其他系统的请求隐藏在Gateway后面,并将有关外部API的所有血淋淋的细节保存在那里。此外,best practice将为每个应用程序使用一个HttpClient,因为它们有一个设计缺陷,在释放套接字后仍会保留这些套接字。

如果您使用的是dotnet核心,那么使用HttpClientFactory获取一个池化HttpClient的实例

用于在Global.asax中创建HttpClient

代码语言:javascript
复制
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();
    }
}

一个简单的实现可能是

代码语言:javascript
复制
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。

然后你的控制器就可以保持干净了。

就像这样

代码语言:javascript
复制
        var gateway = new ExternalGateway(MvcApplication.HttpClient);
        var model = await gateway.GetSomeExternalResource(new Uri("<your complete url>"));

        return View(model);

这假设您将在视图中使用强类型模型,而不是ViewBag。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56384072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档