2017-02-21 15 views
0

Я очень, очень новичок во всей идее REST и назвал API от http в целом, но для проекта, над которым я работаю, это стало необходимым.нечетко передается параметров через HttpClient в .NET Core

Я использую ASP.NET Core, поэтому я пытался найти библиотеку REST. Когда я использовал стандарт .NET, я мог бы использовать RestSharp, но сообщество RestSharp.Core довольно устарело и имеет много несовместимостей с более новыми версиями .NET Standard 1.6+.

С этой целью я изучил другие варианты, но моя неопытность просто расстраивает. Неизбежно, я думаю, что лучше всего использовать встроенный класс HttpClient. Но я не уверен, как это сделать для этого точного сценария. Мне очень сложно понять, как указать параметры для запроса, и что я специально ищу в возвращаемом значении.

Мои потребности довольно просты;

  1. создать соединение с $url
  2. указать, что это POST операция.
  3. передать существующий объект JSON на сервер при оформлении запроса.
  4. получить JSON данные назад.

Мой код, используя старый RestSharp.Core, выглядит примерно так: очевидно ключи и такие пропущенные для конфиденциальности.

public async Task<string> OpenApiAsync() { 
    var token = await Task.Run(async() => { 
     var httpClient = new RestClient("https://[OMITTED].auth0.com/oauth/token"); 
     var httpRequest = new RestRequest() { 
      Serializer = new RestSharp.Serializers.JsonSerializer(), 
      Method = Method.POST 
     }; 

     httpRequest.AddHeader("content-type", "application/json"); 
     httpRequest.AddJsonBody(new { 
      client_id = _settings.Value.ClientId, 
      client_secret = _settings.Value.ClientSecret, 
      audience = _settings.Value.Audience, 
      grant_type = _settings.Value.GrantType 
     }); 

     var httpResponse = await httpClient.Execute(httpRequest); 
     var deserializer = new RestSharp.Deserializers.JsonDeserializer(); 
     return deserializer.Deserialize<Dictionary<string, string>>(httpResponse); 
    }); 

    return token["access_token"]); 
} 

Объект _settings вводят IOptions<Auth0Settings>, который имеет такую ​​форму и общие данные.

"authentication": { 
    "Domain": "[auth0-domain]", 
    "Audience": "https://[OMITTED].auth0.com/api/v2/", 
    "ClientId": "ABCDEFGHIJKLMNOP....", 
    "ClientSecret": "A22u5hgbnwifhwihfwi20u559f...", 
    "CallbackUrl": "http://localhost:5000/signin-auth0", 
    "GrantType": "client_credentials" 
} 

Может кто-нибудь помочь мне понять, как это может быть перенесен на родную HttpClient, который находится в .NET Standard 1.6+? Мне особенно нужен тот, который совместим с netstandard1.6 и netcoreapp1.1.

ответ

0

HttpClient очень хороший клиент HTTP и должен быть использован в ядро ​​.NET двигаться вперед :)

private static async Task<string> OpenApiAsync() 
    { 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Add("content-type", "application/json"); 
     var body = JsonConvert.SerializeObject(YOUR_BODY); 
     var result = await client.PostAsync("https://[OMITTED].auth0.com/oauth/token", new StringContent(body , Encoding.UTF8)); 
     var deserialized = JsonConvert.DeserializeObject<Dictionary<string, string>>(await result.Content.ReadAsStringAsync()); 
     return deserialized["access_token"]; 
    } 
+0

Спасибо так много. Это значительно облегчило, и это позволило мне отказаться от зависимости от довольно тяжелого и неустойчивого пакета! – Ciel

+0

@Ciel одна приятная вещь о '' 'HttpClient''' заключается в том, что она потокобезопасна. Поэтому лучше всего использовать один '' 'HttpClient''' для удаленного сервера :) –