Как использовать RestSharp.NetCore в ядре asp.net
Я прошел через http://restsharp.org/ код, который отлично работает. Ниже приведен код RestSharp без ядра asp.net.
public GenericResponseObject<T> GetGeneric<T>(string operation, params KeyValuePair<string, string>[] nameValues) where T : class
{
RestClient client = new RestClient(_baseUrl)
{
Authenticator = new HttpBasicAuthenticator(_username, _password)
};
RestRequest request = new RestRequest(operation, Method.GET);
foreach (KeyValuePair<string, string> nameValue in nameValues)
{
request.AddQueryParameter(nameValue.Key, nameValue.Value);
}
IRestResponse<GenericResponseObject<T>> response = client.Execute<GenericResponseObject<T>>(request);
GenericResponseObject<T> responseObject = response.Data;
return responseObject;
}
}
Этот код прекрасно работает для меня. Теперь я хочу реализовать тот же код в ядре asp.net.
Могу ли я получить пример, как использовать RestSharp в ядре asp.net. Я добавил зависимость RestSharp.NetCore ": 105.2.3.
Ответы
Ответ 1
RestSharp v106 поддерживает .NET Standard, поэтому ваш код должен работать без изменений.
Пакет RestSharp.NetCore
не принадлежит команде RestSharp и не поддерживается нами. Он также не обновляется, и владелец не отвечает на сообщения, и исходный код пакета не публикуется.
Ответ 2
Обновление: я до сих пор вижу голоса по этому вопросу. Пожалуйста, следуйте ответу Алексея Зимарева. Этот ответ был для не-открытого пакета RestSharp.NetCore
, когда официальный пакет RestSharp не предназначался для .NET Standard.
Добавляя ответ Antwone Antics, создайте класс расширения:
public static class RestClientExtensions
{
public static async Task<RestResponse> ExecuteAsync(this RestClient client, RestRequest request)
{
TaskCompletionSource<IRestResponse> taskCompletion = new TaskCompletionSource<IRestResponse>();
_ = client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
return (RestResponse)(await taskCompletion.Task);
}
}
Теперь вы можете использовать его следующим образом:
var client = new RestClient(BASE_URL);
var request = new RestRequest();
// do whatever else you want/need to, to the request
// ...
// ... and use it like we used to
var response = await client.ExecuteAsync(request);
Вы также можете создавать методы расширения, которые анализируют ответ для получения строгого типа и так далее.
Ответ 3
Существует существующий вопрос и пример StackOverflow, который вызывает ExecuteAsync в RestSharp.NetCore.
Пример ExecuteAsyncPost в RestSharp.NetCore
Я успешно использовал этот пример при ссылке RestSharp.NetCore 105.2.3 на Newtonsoft.Json 9.0.2-beta2.
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using RestSharp;
public async Task<SomeObject> TestPost(ObjectFoo foo)
{
JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings {
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
RestClient restClient = new RestClient(API_URL);
RestRequest request = new RestRequest("SOME_METHOD", Method.POST);
request.AddHeader("Accept", "application/json");
string jsonObject = JsonConvert.SerializeObject(foo, Formatting.Indented, jsonSerializerSettings);
request.AddParameter("application/json", jsonObject, ParameterType.RequestBody);
TaskCompletionSource<IRestResponse> taskCompletion = new TaskCompletionSource<IRestResponse>();
RestRequestAsyncHandle handle = restClient.ExecuteAsync(
request, r => taskCompletion.SetResult(r));
RestResponse response = (RestResponse)(await taskCompletion.Task);
return JsonConvert.DeserializeObject<SomeObject>(response.Content);
}
Ответ 4
Вы можете использовать FubarCoder.RestSharp.Portable.HttpClient
, который вызывается владельцем какого-либо порта RestSharp для PCL. Он нацелен на .NET Standard (поэтому он работает на .NET Core).
См. FubarCoder.RestSharp.Portable.HttpClient
в NuGet.
Ответ 5
Я создал метод расширения из него (см. Комментарий выше для контекста).
public static class RestSharpExtensions
{
public static RestResponse Execute(this IRestClient client, IRestRequest request)
{
var taskCompletion = new TaskCompletionSource<IRestResponse>();
client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
return (RestResponse)(taskCompletion.Task.Result);
}
}
теперь я могу использовать его как var response = restClient.Execute(request);