Как использовать 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);