2017-02-06 4 views
0

У меня есть несколько библиотек с открытым исходным кодом, которые я написал с нуля, или они внесли свой вклад в использование того же формата для генерации HTTP-запросов в точку входа API. В настоящее время они написаны следующим образом:Рефакторинг HTTP-запроса

private string _apiExtension = $"&appid={_apiKey}"; 
    private string _apiEntryPoint = "http://api.openweathermap.org/data/2.5/"; 

    public static string GenerateWebRequest(string conn) 
    { 
     try 
     { 
      if (!string.IsNullOrEmpty(conn)) 
      { 
       using (var webClient = new WebClient()) 
       { 
        return webClient.DownloadString(conn); 

       } 
      } 

     } 
     catch (WebException e) 
     { 
      Console.WriteLine(e.StackTrace); 
     } 
     return string.Empty; 
    } 

Используется для генерации HTTP-запроса и возврата ответа JSON.

Я тогда строить conn вот так:

string queryByPoint = _apiEntryPoint + $"weather?lat={latitude}&lon={longitude}" + _apiExtension; 

, который будет выглядеть примерно так:

http://api.openweathermap.org/data/2.5/weather?lat={latitude}&lon={longitude}&appid={_apiKey} 

с _apiKey и _apiEntryPoint, являющихся строками, которые инициализируются в конструкторе для библиотеки.

Есть ли лучший способ сделать это? В небольшом масштабе построение строки подключения не является точно налогообложением, но я чувствую, что повторение кода и использование 4 строк кода для создания одного URL-адреса, вероятно, чрезмерно.

+0

Каковы 4 строки кода, которые дублируются? – Aaron

ответ

1

Вот как Flurl может помочь здесь (отказ от ответственности: Я автор): основные задачи

var queryByPoint = _apiEntryPoint 
    .AppendPathSegment("weather") 
    .SetQueryParams(new { lat = latitude, lon = longitude, appid = _apiKey }); 

Flurl являются для того, чтобы building URLs in fluent, structured way (захватить только core package, если это все, что вам нужно), и свободно вызывая тем URL-адресов и десериализации ответа примерно за несколько нажатий клавиш по возможности для человека (захватите Flurl.Http для всех бит). Много усилий было сделано для включения testability, extensibility и cross-platform support, и все это, я считаю, идеально подходит для библиотек API-обложек.

+0

Эй, спасибо за ответ. Похоже, именно то, что я искал, спасибо! –