如何在asp.net core中使用RestSharp.NetCore

26

我已经查看了 http://restsharp.org/ 的代码,它非常出色。以下是不带asp.net core的RestSharp代码。

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 core中实现相同的代码。

我能否获得一个示例,演示如何在asp.net core中使用RestSharp。我已经添加了依赖项RestSharp.NetCore": 105.2.3

4个回答

47

RestSharp v106支持.NET Standard,因此您的代码应无需更改即可正常工作。

RestSharp.NetCore包不是由RestSharp团队提供支持的。它也没有得到更新,所有者也不回应消息,该包的源代码也没有发布。


在哪里可以找到示例呢?我有一个 .NET Core Web API,想要使用 RestSharp 调用我的其他 Web 服务,但是找不到任何示例或教程。希望你能添加链接或示例。谢谢! - saber tabatabaee yazdi
1
我其实一直在想为什么 RestSharp.NetCore SDK 这么糟糕... 现在有点明白了。 - Trae Moore
我无法安装RestSharp.Netcore NuGet包。只好回到RestSharp。希望这能为某些人节省一些麻烦。 - Chris J

18

更新:我仍然看到此问题有人点赞。请改为遵循Alexey Zimarev的答案。这个回答是针对非开源的RestSharp.NetCore NuGet包而言,当官方的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);

您还可以创建扩展方法来解析响应以返回强类型等。


2
client.ExecuteAsync 不接受只有一个参数。 - Piero Alberto
@PieroAlberto 是的,这就是为什么你需要上面的扩展方法 :) - galdin
小提示:RestRequestAsyncHandle handle 没有被使用,所以可以省略。 - veuncent

8

有一个现有的StackOverflow问题和示例,调用RestSharp.NetCore上的ExecuteAsync

RestSharp.NetCore中的ExecuteAsyncPost示例

当引用RestSharp.NetCore 105.2.3Newtonsoft.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);
}

请发布一个回答,其中包含需要遵循的步骤。 参考:无 - Sachith Muhandiram
我更进一步,为它创建了一个扩展方法(见下文)。 - bkorzynski

-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);

这是无稽之谈。是 gldraphael 的答案的损坏副本。我说“副本”,因为它确实是这样,而且“损坏”,因为它丢掉了Task/async模式,并通过.Result隐含等待。 - quetzalcoatl
在我的情况下,我需要同步版本,因此我实际上会阻塞直到获取结果。如果我想要异步版本,那么我将简单地使用内置于框架中的ExecuteAsync()方法。我认为你误解了我的用例。 - bkorzynski
1
你能详细说明一下“损坏”的含义吗?如果我说错了,那么我想修正它,以便能帮助其他人。 - bkorzynski
当涉及到任务的隐式等待时,对我来说这是一个错误。在我的看法中,它应该明确地使用.Wait,以便在重构等操作期间,后续的维护人员可以轻松地注意到它。但更重要的是,在最新的.nuget\packages\restsharp\106.2.1\lib\netstandard2.0\RestSharp.dll中,你可以在interface IRestClient中找到:(A)ExecuteAsync(request,callback),其中回调函数可以通过TaskCompletionSource被你用于同步方式,(B) ExecuteTaskAsync(IRestRequest request); 你可以通过.Result.Wait将其转换为同步方式,最后你还有(C)同步Execute(request) - 想象一下。 - quetzalcoatl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接