C#一个开源跨平台的 HTTP 客户端库——RestSharp

RestSharp是一个用于.NET的开源库,简化了与RESTfulWeb服务的交互,支持HTTP请求和响应的处理,包括CRUD操作。通过安装Nuget包,开发者可以轻松实例化客户端,发起POST请求等,实现与WebApi接口的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、RestSharp简介

GitHub - restsharp/RestSharp: Simple REST and HTTP API Client for .NETSimple REST and HTTP API Client for .NET. Contribute to restsharp/RestSharp development by creating an account on GitHub.https://github.com/restsharp/RestSharp         在进行软件开发的时侯,你可能经常需要使用一些公共的Web Api接口执行 CRUD 操作;要连接到这样的Web Api接口并使用它们,您可以有多样的选择;而其中最流行的便是亚马孙的RestSharp,主要是因为它的简单性。

        RestSharp 是一个开源的、可移植(跨平台)、轻量级的.NET 库,主要用于使用 RESTful Web 服务;它可以使用任何 RESTful API 对数据执行 CRUD (创建、读取、更新和删除)操作;RestSharp 是一个用于与 RESTful API 交互的流行库,用于发出 HTTP 请求和解析响应

        使用 RestSharp,您可以在抽象 HTTP 请求的技术细节时与 RESTful 服务进行交互。RestSharp 提供了一个开发人员友好的界面,用于在抽象 HTTP 查询的技术工作时与 RESTful 服务进行交互。RestSharp 可以处理同步和异步请求

二、RestSharp使用方法

2.1、安装RestSharp的Nuget包

2.2、RestSharp的基础使用方法

   ①实例化RestSharp客户端

var client = new RestClient("http://192.168.3.10:8085/api");

    ②实例化一个请求(包含请求的资源、资源请求的参数)

var request = new RestRequest("GetArea");
            request.Method = Method.Post;

    ③执行请求

var reponse = await client.ExecutePostAsync(request);

2.3、RestSharp的使用示例

        比如我这里有一个WebApi接口【http://192.168.3.10:8085/api/GetArea】用于获取区域信息,是Post类型;使用RestSharp获取相应信息的示例如下:

using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

    class Program
    {

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");



            Task<RestResponse> testResult = Test1();

            Console.WriteLine($"Main方法:{testResult.GetAwaiter().GetResult().Content}\n\n");


             ResultDTO resultDTO = JsonConvert.DeserializeObject<ResultDTO>(testResult.GetAwaiter().GetResult().Content);
            Console.WriteLine($"Test1方法:{resultDTO}\n");

             //Test11();

            Console.ReadLine();

        }

        //多线程测试
        private static void Test11()
        {
            for (int i = 0; i < 3; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
                {
                    Console.WriteLine($"{DateTime.Now} 启动{obj} 线程");
                    Task<RestResponse> testResult3 = Test1("http://192.168.3.10:8085/api/", "GetUsers", "{ \"UserName\":\"\"}");
                }),i);
            }
           
           
        }

        /// <summary>
        /// 测试
        /// </summary>
        /// <param name="baseUrl">WebApi的基础路径</param>
        /// <param name="resourceName">WebApi的资源名称</param>
        /// <param name="jsonPara">WebApi资源的json参数字符串</param>
        /// <returns></returns>
        public static async Task<RestResponse> Test1(string baseUrl= "http://192.168.3.10:8085/api/",string resourceName= "GetArea", string jsonPara=null)
        {
            if (string.IsNullOrEmpty(baseUrl) ||string.IsNullOrEmpty(resourceName)) return null;
            var client = new RestClient(baseUrl);

            var request = new RestRequest(resourceName);
            request.Method = Method.Post;
            if (!string.IsNullOrEmpty(jsonPara))
            {
                request.AddBody(jsonPara);
            }


            //var reponse = await client.ExecutePostAsync(request);

            //ResultDTO resultDTO = JsonConvert.DeserializeObject<ResultDTO>(reponse.Content);
            //Console.WriteLine($"Test1方法:{resultDTO}\n");

            var reponse = await client.ExecutePostAsync<ResultDTO>(request);


            return reponse;
        }


        /// <summary>
        /// 解析Json字符串(首尾没有中括号)【线程安全】
        /// </summary>
        /// <param name="jsonStr">需要解析的Json字符串</param>
        /// <returns>返回解析好的Hashtable表</returns>
        private static Hashtable AnalayJsonString(string jsonStr)
        {
            Hashtable ht = new Hashtable();
            if (!string.IsNullOrEmpty(jsonStr))
            {
                JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
                foreach (var item in jo)
                {
                    ht.Add(item.Key, item.Value);
                }
            }

            foreach (DictionaryEntry item in ht)
            {
                Console.WriteLine(item.Key + " " + item.Value);
            }

           return ht;
        }

        #region   解析Json字符串(首尾有中括号)

        /// <summary>
        /// 解析Json字符串(首尾有中括号[存在相同键])【线程安全】
        /// </summary>
        /// <param name="jsonStr">需要解析的Json字符串</param>
        /// <returns>返回解析好的数据</returns>
        public static ConcurrentBag<KeyValuePair<string, object>> AnalayJsonStringMiddleBrackets(string jsonStr)
        {
            ConcurrentBag<KeyValuePair<string, object>> cb = new ConcurrentBag<KeyValuePair<string, object>>();
            if (!string.IsNullOrEmpty(jsonStr))
            {
                JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonStr);//jsonArrayText必须是带[]字符串数组
                if (jArray != null && jArray.Count > 0)
                {
                    foreach (var item in jArray)
                    {
                        foreach (JToken jToken in item)
                        {
                            string[] strTmp = jToken.ToString().Split(':');
                            KeyValuePair<string, object> kv = new KeyValuePair<string, object>(strTmp[0].Replace("\"", ""), strTmp[1].Replace("\"", ""));
                            cb.Add(kv);
                        }
                    }
                }

                foreach (var item in cb)
                {
                    Console.WriteLine(item.Key + " " + item.Value);
                }
            }
            return cb;
        }


 
        #endregion


        public class ResultDTO
        {
            public string Success { get; set; }

            public string Result { get; set; }
            public string StatusCode { get; set; }

            public string Message { get; set; }

            public override string ToString()
            {
                string tmp = string.Empty;
                if (Result.Contains('['))
                {
                    tmp = $"\nSuccess:{Success}\nStatusCode:{StatusCode}\nMessage:{Message}\nResult:{AnalayJsonStringMiddleBrackets(Result)}\n";
                }
                else
                {
                    tmp = $"\nSuccess:{Success}\nStatusCode:{StatusCode}\nMessage:{Message}\nResult:{AnalayJsonString(Result)}\n";
                }
               
                return tmp;
            }

        }
    }

执行结果如下:

三、参考资料 

RestSharp Next (v107+) | RestSharpicon-default.png?t=N5K3https://restsharp.dev/v107/#restsharp-v107How to consume a Web API using RestSharp | InfoWorldicon-default.png?t=N5K3https://www.infoworld.com/article/3252769/how-to-consume-a-web-api-using-restsharp.html How To Consume a WebAPI with RestSharp -- Visual Studio Magazineicon-default.png?t=N5K3https://visualstudiomagazine.com/articles/2015/10/01/consume-a-webapi.aspx

Consume a RESTful API Using RestSharp and C# - Devart Blogicon-default.png?t=N5K3https://blog.devart.com/consume-a-restful-api-using-restsharp-and-c.html

好的,以下是一个使用 mqttnet ,利用 c# 完成 MQTT 客户端程序的示例代码: ```csharp using System; using System.Text; using System.Threading; using System.Threading.Tasks; using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Options; using MQTTnet.Client.Subscribing; using MQTTnet.Protocol; namespace MqttClientDemo { class Program { static async Task Main(string[] args) { // 创建 MQTT 客户端实例 var mqttClient = new MqttFactory().CreateMqttClient(); // 配置 MQTT 客户端选项 var options = new MqttClientOptionsBuilder() .WithClientId("mqtt_client") .WithTcpServer("localhost", 1883) .WithCredentials("username", "password") .WithCleanSession() .Build(); // 连接到 MQTT 服务器 await mqttClient.ConnectAsync(options); // 订阅主题 var topicFilters = new TopicFilter[] { new TopicFilterBuilder().WithTopic("test").Build() }; await mqttClient.SubscribeAsync(topicFilters); // 发布消息 var message = new MqttApplicationMessageBuilder() .WithTopic("test") .WithPayload("hello, world") .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce) .WithRetainFlag() .Build(); await mqttClient.PublishAsync(message); // 接收消息 mqttClient.UseApplicationMessageReceivedHandler(e => { Console.WriteLine($"Received message: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}"); }); // 等待 5 秒钟 await Task.Delay(TimeSpan.FromSeconds(5)); // 取消订阅主题 await mqttClient.UnsubscribeAsync("test"); // 断开 MQTT 连接 await mqttClient.DisconnectAsync(); } } } ``` 在上述示例代码中,首先创建了一个 MQTT 客户端实例,然后配置 MQTT 客户端选项,包括客户端 ID、TCP 服务器地址、用户名密码、连接选项等。接着使用 `ConnectAsync` 方法连接到 MQTT 服务器,并使用 `SubscribeAsync` 方法订阅主题。 然后使用 `PublishAsync` 方法发布一条消息到指定主题,并使用 `UseApplicationMessageReceivedHandler` 方法注册一个消息接收处理程序,接收并处理订阅的消息。 最后使用 `UnsubscribeAsync` 方法取消订阅主题,并使用 `DisconnectAsync` 方法断开 MQTT 连接。 需要注意的是,以上示例代码仅供参考,实际使用时需要根据具体的需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛奶咖啡13

我们一起来让这个世界有趣一点…

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值