Я очень, очень новичок во всей идее REST
и назвал API от http в целом, но для проекта, над которым я работаю, это стало необходимым.нечетко передается параметров через HttpClient в .NET Core
Я использую ASP.NET Core
, поэтому я пытался найти библиотеку REST. Когда я использовал стандарт .NET
, я мог бы использовать RestSharp
, но сообщество RestSharp.Core
довольно устарело и имеет много несовместимостей с более новыми версиями .NET Standard 1.6+
.
С этой целью я изучил другие варианты, но моя неопытность просто расстраивает. Неизбежно, я думаю, что лучше всего использовать встроенный класс HttpClient
. Но я не уверен, как это сделать для этого точного сценария. Мне очень сложно понять, как указать параметры для запроса, и что я специально ищу в возвращаемом значении.
Мои потребности довольно просты;
- создать соединение с
$url
- указать, что это
POST
операция. - передать существующий объект
JSON
на сервер при оформлении запроса. - получить
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
.
Спасибо так много. Это значительно облегчило, и это позволило мне отказаться от зависимости от довольно тяжелого и неустойчивого пакета! – Ciel
@Ciel одна приятная вещь о '' 'HttpClient''' заключается в том, что она потокобезопасна. Поэтому лучше всего использовать один '' 'HttpClient''' для удаленного сервера :) –