.net 客户端开发 “粗体验”

Posted 汪小哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net 客户端开发 “粗体验”相关的知识,希望对你有一定的参考价值。

一、背景

最近有个.net 的 sdk的开发功能 ,将之前java 开发的迁移进去…好久没有写 c# 这个玩意,大学也没有类似的经历,而且是mac 环境 开发起来不是很舒畅,快捷键不是很熟悉…

开发工具

下载开发工具: https://docs.microsoft.com/zh-cn/visualstudio/mac/installation?view=vsmac-2019

包管理

NuGet

第一个功能就是要使用http 的客户端,如何加入进来的问题 :
http 客户端: https://www.nuget.org/packages/Microsoft.Net.Http/

二、解决问题

2.1 Http 请求客户端 Microsoft.Net.Http

google c# http client : https://stackoverflow.com/questions/23585919/send-json-via-post-in-c-sharp-and-receive-the-json-returned
在这里找到了… http客户端 还有例子 分享的精神非常不错哦!

语法糖不是很关心异步 await 和 Java 还是蛮像的!

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace Test

    public class HttpUtil
    


        //  发送http请求 
        public static async Task<String> PostUrlAsync(string url, string stringPayload, double timeoutMilliseconds)
        
            using (HttpClient client = new HttpClient())
            
                if (Double.IsPositiveInfinity(timeoutMilliseconds))
                
                    client.Timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                
                else
                
                    client.Timeout = TimeSpan.FromMinutes(10);
                

                
                var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");

                using (HttpResponseMessage response = await client.PostAsync(url, httpContent))
                
                 
                    return await response.Content.ReadAsStringAsync();

                
            

        
    


Task<string> result = HttpUtil.PostUrlAsync(url, requestStr, timeout);
responseJson = result.Result.ToString();

2.2 json 客户端一样 Newtonsoft.Json

https://www.newtonsoft.com/json 都可以在 包管理中直接搜索
和 Java 语法类似 这里也有泛型的 Type 这种概念,通过type 转换 为json。

using System;
using Newtonsoft.Json;

namespace Test

    // // json 工具类封装
    public class JSON
    
        public JSON()
        
        

        // 对象转换为 json 
        public static String ToJSONString(Object data)
        
            var setting = new JsonSerializerSettings
            
                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
            ;

            return JsonConvert.SerializeObject(data, Formatting.None, setting);
        


        // json string 转换为 对象
        public static T ParseObject<T>(String text)
        
            return JsonConvert.DeserializeObject<T>(text);
        

        // json  string 根据type 转换为 对象 
        public static T ParseObject<T>(String text, Type type)
        
            return (T)JsonConvert.DeserializeObject(text, type);
        
    


2.3 泛型的写法问题

  • 限定 参数

https://zhidao.baidu.com/question/1301884451169679939.html
https://stackoverflow.com/questions/557340/how-to-get-the-type-of-t-from-a-member-of-a-generic-class-or-method
https://blog.csdn.net/yanfeng918/article/details/29826511

// 泛型的写法问题 
 public static T Execute<T>(BaseRequest<T> requet) where T : BaseResponse

通过传入的request 直接获取 response 然后进行限定

  • 父类 子类 获取 泛型的type
using System;
namespace Test

    public abstract class BaseRequest<T> where T : BaseResponse
    
        private Type typeT;

        public BaseRequest()
        
            //获取 泛型的类型
            Type type = this.GetType();
            TypeT = type.BaseType.GetGenericArguments()[0];
        

        public Type TypeT  get => typeT; set => typeT = value; 

        public abstract String GetApiPath();

    

using System;
namespace Test

    public class HelloRequest : BaseRequest<HelloResponse>
    
        public HelloRequest()
        
        

        public override string GetApiPath()
        
            return "/api/test";
        
    



using System;
namespace Test

    public class BaseResponse
    
        private String message;

        public BaseResponse()
        
        

        public string Message  get => message; set => message = value; 
    


using System;
namespace Test

    public class HelloResponse : BaseResponse
    
        private String helloPass;

        public HelloResponse()
        
        

        public string HelloPass  get => helloPass; set => helloPass = value; 
    


  • 泛型的实例化

T reponse = (T)Activator.CreateInstance(typeof(T));

using System;
using Test;
using Newtonsoft.Json;

namespace Test

    class Program
    
        static void Main(string[] args)
        
            HelloRequest helloRequest = new HelloRequest();
            HelloResponse helloResponse = Execute(helloRequest);
            
        

        // 泛型的写法问题 
        public static T Execute<T>(BaseRequest<T> requet) where T : BaseResponse
        
            T reponse = (T)Activator.CreateInstance(typeof(T));
            reponse.Message = "error";

            if (true)
            
                // http请求;
                var responseStr = "";

                reponse = (T)JsonConvert.DeserializeObject(responseStr, requet.TypeT);
                reponse.Message = "ok";
            
           
            return reponse;
        
    


2.4 调试 .net 打包的 dll

调试打包的dll 有问题无法debug ,可以 将那个源文件 引入到 当前工程 不进行复制过来,这样就可以愉快的debug了。

三、整体解决问题

一个requeset 对应一个 Response,通过request 直接返回 Response,requeset 构造参数、安全处理、http请求、返回值构造实例化字段信息,方便使用。整体上看和Java 差不多,使用感觉还是Java 好啊,用多了。。。估计 。 新的东西、新的思考,用了1day 搞定了这些问题 感觉还不错。

以上是关于.net 客户端开发 “粗体验”的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 开发系列一 开发踩坑

微软跨平台maui开发chatgpt客户端

用C#开发的程序,我现在使用mono脱离了.net环境,但是在没有.net环境的电脑上打不开,不知怎么办?

.NET(c#) 移动APP开发平台 - Smobiler平台介绍

Winform_devexpress开发框架主界面设计

Docker:感觉自己萌萌哒