Это хороший способ реализовать HTTP-запрос к API? - PullRequest
1 голос
/ 30 мая 2019

Я изучаю, как использовать сторонний API, и хотел знать, является ли то, что у меня есть, хорошим способом реализации HTTP-запроса к API. Я создал приватный метод, который используется для отображения информации во внешнем интерфейсе, я сделал это таким образом, чтобы не помещать все в метод 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;
        }

1 Ответ

1 голос
/ 30 мая 2019

Держите ваши запросы к другим системам скрытыми за шлюзом и храните там все мрачные подробности о внешнем API. Также рекомендуется использовать по одному HttpClient для каждого приложения, потому что у них есть недостаток дизайна, который сохраняется на сокетах после их утилизации.

Если вы используете ядро ​​dotnet, используйте HttpClientFactory, чтобы получить экземпляр пула HttpClient

Для создания HttpClient в вашем Global.asax

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...