博客
关于我
.NET Core 下调用WebAPI
阅读量:798 次
发布时间:2023-04-04

本文共 8501 字,大约阅读时间需要 28 分钟。

使用 RestSharp 调用 Web API

前言

在开发过程中,作为开发人员,我们需要多种方式来调用 Web API。这些方式可以是直接使用原生 HTTP 序列化库,或者借助 .NET 框架提供的第三方 HTTP 库。RestSharp 是一个基于 .NET 框架的 REST 客户端工具,它以其轻量级和高效性著称,适合处理 HTTP 请求任务。

RestSharp 简介

RestSharp 是一个强大的 HTTP 客户端工具,主要特点包括:

  • 支持多种 HTTP 方法:支持 GET、POST、 PUT、PATCH、HEAD、OPTIONS、DELETE 和 COPY 等非标准 HTTP 方法。
  • 自动序列化和反序列化:支持 JSON 和 XML 格式的数据自动序列化与反序列化。
  • 灵活的请求配置:允许自定义请求头、参数和 URL Segments。
  • 身份验证支持:支持 OAuth 1.0、OAuth 2.0、Basic、NTLM 和基于参数的身份验证等多种方式。
  • 异步支持:允许通过 async/await 异步执行 HTTP 请求。
  • 模糊匹配:支持 XML 或 JSON 元素名称与 C# 属性名的模糊匹配。
  • RestSharp 实战示例

    安装 RestSharp

    通过 NuGet 包管理器轻松安装 RestSharp:

    PM> Install-Package RestSharp

    创建 RestSharp 客户端

    // 使用默认构造函数var client = new RestClient("https://api.example.com");// 自定义构造函数var client = new RestClient("https://api.example.com", new HttpBasicAuthenticator("username", "password"));

    发送 HTTP 请求

    var request = new RestRequest("resource/{id}", Method.POST);request.AddParameter("name", "value");request.AddUrlSegment("id", "123");request.AddObject(new { Id = 123, Name = "Test" });IRestResponse response = client.Execute(request);// 获取响应内容var content = response.Content;// 反序列化为对象var deserialized = response.Data;

    异步请求

    var request = new RestRequest("resource/{id}", Method.POST){    AddObject(new { Id = 123, Name = "Test" })};IRestResponse response = await client.ExecuteAsync(request);var result = response.Data;

    自定义身份验证

    client.Authenticator = new HttpDigestAuthenticator("username", "password");

    实现 Rest 接口执行者

    定义接口

    public interface IRestSharp{    IRestResponse Execute(IRestRequest request);    T Execute
    (IRestRequest request) where T : new(); RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action
    callback);}

    实现类

    public class RestSharpClient : IRestSharp{    private RestClient client;    private string BaseUrl { get; set; }    private string DefaultDateParameterFormat { get; set; }    private IAuthenticator DefaultAuthenticator { get; set; }    public RestSharpClient(string baseUrl, IAuthenticator authenticator = null)    {        BaseUrl = baseUrl;        client = new RestClient(BaseUrl);        DefaultAuthenticator = authenticator;        DefaultDateParameterFormat = "yyyy-MM-dd HH:mm:ss";        if (DefaultAuthenticator != null)        {            client.Authenticator = DefaultAuthenticator;        }    }    public IRestResponse Execute(IRestRequest request)    {        request.DateFormat = string.IsNullOrEmpty(request.DateFormat)                           ? DefaultDateParameterFormat                           : request.DateFormat;        return client.Execute(request);    }    public T Execute
    (IRestRequest request) where T : new() { request.DateFormat = string.IsNullOrEmpty(request.DateFormat) ? DefaultDateParameterFormat : request.DateFormat; var response = client.Execute(request); return response.Data; } public RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action
    callback) { request.DateFormat = string.IsNullOrEmpty(request.DateFormat) ? DefaultDateParameterFormat : request.DateFormat; return client.ExecuteAsync(request, callback); }}

    使用案例

    获取数据

    var client = new RestSharpClient("http://localhost:82/");var result = client.Execute(new RestRequest("api/values", Method.GET));var content = result.Content;

    发送 POST 请求

    var client = new RestSharpClient("http://localhost:82/");var request = new RestRequest("api/values", Method.POST){    AddObject(new { Name = "Test" })};var response = client.Execute(request);

    实现 HttpHelper 类

    GET API

    public static class HttpHelper{    public static T GetApi
    (int regattaId, string apiName, string pragm = "") { var client = new RestSharpClient($"{SiteConfig.GetSite("Url")}"); var apiNameStr = string.Format($"{SiteConfig.GetSite($"{apiName}")}", regattaId); var request = string.IsNullOrEmpty(pragm) ? new RestRequest(apiNameStr, Method.GET) : new RestRequest($"{apiNameStr}/{pragm}", Method.GET); if (request.StatusCode != HttpStatusCode.OK) { return (T)Convert.ChangeType(request.ErrorMessage, typeof(T)); } T result = (T)Convert.ChangeType(request.Content, typeof(T)); return result; } public static T PostApi
    (int regattaId, int id, string url, string alias) { var client = new RestClient($"{url}"); IRestRequest request = new RestRequest(); request.Method = Method.POST; request.AddHeader("Accept", "application/json"); request.RequestFormat = DataFormat.Json; request.AddBody(new { UserId = id, Url = url, Alias = alias, Count = 1 }); var result = client.Execute(request); if (result.StatusCode != HttpStatusCode.OK) { return (T)Convert.ChangeType(result.ErrorMessage, typeof(T)); } T response = (T)Convert.ChangeType(result.Content, typeof(T)); return response; }}

    调用示例

    // GETvar notificationList = HttpHelper.GetApi
    (regattaId, "notification");// POSTvar result = HttpHelper.PostApi
    (regattaId, id, url, alias);

    API 端接收

    GET 请求

    [Route("{regattaId}/[controller]")][HttpGet]public async Task
    GetNotifications(int regattaId){ return await _notificationServices.GetNotifications(regattaId);}

    POST 请求

    [Route("{regattaId}/pageviews")][HttpPost]public async Task PostInfo(int regattaId, [FromBody] PageViewsDto pageViewsDto){    await _pageviewServices.InsertPostInfo(regattaId, pageViewsDto);}

    PageViewsDto 定义

    public class PageViewsDto{    public int Id { get; set; }    public string Url { get; set; }    public string Alias { get; set; }    public string UserId { get; set; }    public int Count { get; set; }    public PageViewsDto()    {        Id = 0;        Count = 1;    }}

    发送 POST 请求并携带实体参数

    public async Task UpdateUser(PersonModel model){    var url = $"{SiteConfig.GetSite("Url")}{SiteConfig.GetSite("updateUserByAccount")}";    var resultDetil = await HttpUtil.PostResultAsync(model, url);    return resultDetil;}

    PostResultAsync 实现

    public static class HttpUtil{    public static async Task
    PostResultAsync
    (object obj, string url) { var setting = new JsonSerializerSettings(); setting.Converters.Add(new StringEnumConverter()); setting.NullValueHandling = NullValueHandling.Ignore; var retdata = await HttpPostAsync(url, JsonConvert.SerializeObject(obj, setting)); return JsonConvert.DeserializeObject
    (retdata); } private static async Task
    HttpPostAsync(string url, string postData, string certPath = "", string certPwd = "") { var request = CreateJsonRequest(url, HttpMethod.POST, postData, certPath, certPwd); return await GetResponseStringAsync(request); } private static HttpWebRequest CreateJsonRequest(string url, HttpMethod method, string postData = "", string certpath = "", string certpwd = "") { var request = (HttpWebRequest)WebRequest.Create(url); request.Method = method.ToString(); request.ContentType = "application/json; charset=utf-8"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => true); if (!string.IsNullOrEmpty(certpath) && !string.IsNullOrEmpty(certpwd)) { X509Certificate2 cer = new X509Certificate2(certpath, certpwd, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); request.ClientCertificates.Add(cer); } if (method == HttpMethod.POST) { using (var sw = new StreamWriter(request.GetRequestStream())) { sw.Write(postData); } } return request; } private static async Task
    GetResponseStringAsync(HttpWebRequest request) { using (var response = await request.GetResponseAsync() as HttpWebResponse) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } }}

    结论

    RestSharp 是一个强大的 HTTP 客户端工具,适用于调用 RESTful Web 服务。通过 RestSharp,我们可以轻松地发送各种 HTTP 请求,并处理响应数据。通过自定义的接口和类,我们可以将 REST 调用嵌入到日常的开发工作中,提高开发效率。

    转载地址:http://rnrfk.baihongyu.com/

    你可能感兴趣的文章
    MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    ms sql server 2008 sp2更新异常
    查看>>
    MS UC 2013-0-Prepare Tool
    查看>>
    msbuild发布web应用程序
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>