为了账号安全,请及时绑定邮箱和手机立即绑定

在 WinFroms 中集中 API CRUD 调用

在 WinFroms 中集中 API CRUD 调用

C#
杨魅力 2021-10-24 16:36:57
我需要在 Winforms 应用程序中进行 CRUD 调用。为此,我想为 Post、Put、Delete 和 Get 创建辅助方法。这个方法需要将数据返回给我。对于 post 和 put,我可能会传递 List、myobject、string、int、bool 等。我的返回类型可能与我输入的模型不同。为了实现上述目标,我正在考虑以下方面...返回给调用者的类public class ApiCallResult<X> where X: class {    public HttpStatusCode StatusCode { get; set; }    public string ReasonPhrase { get; set; }    public bool IsError { get; set; }    public bool IsException { get; set; }    public string Message { get; set; }    public X Response { get; set; } //deserialized object, could be List, int string or just a single object}但显然这有多个问题异步可以返回一个任务,我想返回 apiCallResultvar apiCallResult = new ApiCallResult<T> {IsError = true, Message = "No run"}; 线导致 The type 'T' must be a reference type in order to use it as parameter 'T'apiCallResult.Response = JsonConvert.DeserializeObject<List<X>>(jsonResponseString).ToList(); 线导致 Cannot convert source type 'System.Collections.Generic.List<X>' to target type 'T'我怎样才能最好地做这样的事情?不想编写多个方法来执行此操作。
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

也许像这样?


public static async Task<ApiCallResult<X>> Post<T, X>(T data, X returnModel, string apiUrl) where X: class

{

    var apiCallResult = new ApiCallResult<X> { IsError = true, Message = "No run" };

    try

    {

        //json string 

        var jsonString = JsonConvert.SerializeObject(data);

        using (var client = new HttpClient())

        {

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

            var response = await client.PostAsync(apiUrl, httpContent);

            var jsonResponseString = await response.Content.ReadAsStringAsync();


            //fill

            apiCallResult.StatusCode = response.StatusCode;

            apiCallResult.ReasonPhrase = response.ReasonPhrase;

            if (response.IsSuccessStatusCode)

            {

                //deserialize

                if (typeof(X).GetGenericTypeDefinition() == typeof(List<>))

                {

                    // X is a generic list

                    apiCallResult.Response = JsonConvert.DeserializeObject<X>(jsonResponseString);

                }

                else

                {

                    //single object

                    apiCallResult.Message = JsonConvert.DeserializeObject<X>(jsonResponseString).ToString();

                }

                apiCallResult.IsError = false;

            }

            else

            {

                //error response

                apiCallResult.Message = jsonResponseString;

            }

        }

    }

    catch (Exception ex)

    {

         apiCallResult.IsException = true;

         apiCallResult.Message = ex.Message;

    }


    return apiCallResult;

}


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信