using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Sers.Core.Module.Api; using Sers.Core.Module.Rpc; using Vit.Core.Util.ComponentModel.Data; using Vit.Core.Util.ComponentModel.Model; namespace Did.Serslot.Demo.Controllers { [Route("did_serslot/[controller]")] [Route("did_serslot/v1")] [ApiController] public class ValuesController : ControllerBase { #region (x.1)route /// /// GET did_serslot/Values /// /// [HttpGet] [HttpPost] public object Route0([FromQuery]string a) { //var requestFeature = Request.HttpContext.Features.Get(); return "GET did_serslot/Values?a=" + a; } /// /// GET did_serslot/Values/route_x /// /// [HttpGet("101/route")] [HttpGet("102/route")] [HttpGet("/did_serslot/Values/103/route")] public object Route1() { return new { Request.Path, Request.Method }; } /// /// GET did_serslot/Values/route104 /// /// [HttpGet("[action]")] public object route104() { return new { name = "GET did_serslot/Values/route104", Request.Path, Request.Method }; } #endregion #region (x.2)Name和Desc /// /// 演示 如何使用Name 和 Description。 /// 函数注释和使用SsDescription是一样的效果。 /// /// [HttpGet("201/NameDesc")] [SsName("NameDesc1")] public ApiReturn NameDesc() { return new ApiReturn(); } /// /// /// /// [HttpGet("202/NameDesc")] [SsDescription("演示 如何使用Name 和 Description。\n函数注释和使用SsDescription是一样的效果。")] public ApiReturn NameDesc2() { return new ApiReturn(); } #endregion #region (x.3) 参数 #region (x.x.1) 从route获取参数 /// /// 从route获取参数 /// GET did_serslot/Values/301/arg/{id}/{id2} /// /// [HttpGet("301/arg/{name}/{age}")] public object Arg301( [SsExample("lith"), SsDefaultValue("NoName"), SsDescription("姓名")]string name, [SsExample("30"), SsDefaultValue("0"), SsDescription("年龄,请指定在16-50中间的整数")]int age) { return new { Request.Path, Request.Method, request = new { name, age } }; } #endregion #region (x.x.2)从Query String获取参数 /// /// 从Query String获取参数 /// GET did_serslot/Values/302/arg?name=lith&age=30 /// /// [HttpGet("302/arg")] public object Arg302( [FromQuery, SsExample("lith"),SsDescription("姓名")]string name, [FromQuery, SsExample("30"), SsDescription("年龄,请指定在16-50中间的整数")]int age) { return new { Request.Path, Request.Method, request = new { name, age } }; } #endregion #region (x.x.3)从Body获取参数 /// /// 从Body获取参数 /// POST did_serslot/Values/303/arg /// /// [HttpPost("303/arg")] public object Arg3([FromBody, SsExample("\"lith\""), SsDescription("姓名,请以双引号开始和结束")]string name) { return new { Request.Path, Request.Method, request = new { name } }; } #endregion #region (x.x.4)从Body获取参数 /// /// 从Body获取参数 /// POST did_serslot/Values/304/arg /// /// [HttpPost("304/arg")] public object Arg4([FromBody] ArgModel arg) { return new { Request.Path, Request.Method, request = arg }; } public class ArgModel { /// /// 姓名 /// [SsExample("lith"), SsDefaultValue("NoName")] [JsonProperty("arg")] public string name { get; set; } /// /// /// [SsExample("20"), SsDefaultValue("0"), SsDescription("年龄,请指定在16-50中间的整数")] public int age; } #endregion #region (x.x.5)从Form获取参数 /// /// 从Form获取参数 /// POST did_serslot/Values/304/arg /// /// [HttpPost("305/arg")] public object Arg5([FromForm]ArgModel arg) { return new { Request.Path, Request.Method, request = arg }; } #endregion #endregion #region (x.4) 返回值 #region (x.x.1)返回值注释 /// /// /// /// [HttpGet("401/ret")] [return: SsExample("test1"), SsDescription("返回test1")] public string Return4() { return "test1"; } /// /// /// /// [HttpGet("402/ret")] [return: SsExample("5"), SsDescription("返回5")] public int Return5() { return 5; } /// /// /// /// [HttpGet("403/ret")] [return: /*SsExample("{\"name\":\"张三\"}"),*/ SsDescription("返回模型数据")] public ReturnData Return6() { return new ReturnData { name = "张三" }; } /// /// Return注释-FromType /// public class ReturnData { /// /// 姓名 /// [SsExample("lith"), SsDefaultValue("NoName")] public string name { get; set; } } #endregion #region (x.x.2)异步返回 /// /// GET did_serslot/Values/201/result /// /// [HttpGet("420/result")] public object Result1() { return Request.Method + " " + Request.Path; } /// /// GET did_serslot/Values/202/result /// /// [HttpGet("421/result")] public ActionResult Result2() { return Request.Method + " " + Request.Path; } /// /// GET did_serslot/Values/203/result /// /// [HttpGet("422/result")] public ActionResult> Result3() { return new string[] { Request.Method + " " + Request.Path, "" }; } /// /// GET did_serslot/Values/204/result /// /// [HttpGet("423/result")] public async Task Result4() { await Task.Run(() => { Thread.Sleep(2000); }); return Request.Method + " " + Request.Path; } /// /// GET did_serslot/Values/205/result /// /// [HttpGet("424/result")] public async Task> Result5() { await Task.Run(() => { Thread.Sleep(2000); }); return Request.Method + " " + Request.Path; } #endregion #endregion #region (x.5)指定参数或返回值类型 /// /// 指定参数或返回值类型 /// /// [HttpGet("500/type")] [return: SsType(typeof(List)),SsExample("[5,6]"), SsDescription("返回原值")] public string Type( [SsType(typeof(List)), SsExample("[5,6]"), SsDescription("id数组")]string ids ) { return ids; } #endregion #region (x.6) HttpMethod /// /// GET did_serslot/Values/600/method /// /// [HttpGet("600/method")] public string Method_Get() { return Request.Method + " " + Request.Path; } /// /// POST did_serslot/Values/600/method /// /// [HttpPost("600/method")] public string Method_Post() { return Request.Method + " " + Request.Path; } /// /// Put did_serslot/Values/600/method /// /// [HttpPut("600/method")] public string Method_Put() { return Request.Method + " " + Request.Path; } /// /// Delete did_serslot/Values/600/method /// /// [HttpDelete("600/method")] public string Method_Delete() { return Request.Method + " " + Request.Path; } ///// ///// Head did_serslot/Values/600/method ///// ///// //[HttpHead("600/method")] //public string Method_Head() //{ // return Request.Method + " " + Request.Path; //} /// /// Options did_serslot/Values/600/method /// /// [HttpOptions("600/method")] public string Method_Options() { return Request.Method + " " + Request.Path; } /// /// Patch did_serslot/Values/600/method /// /// [HttpPatch("600/method")] public string Method_Patch() { return Request.Method + " " + Request.Path; } /// /// get|post did_serslot/Values/601/method /// /// [Route("601/method")] [HttpGet, HttpPost] public string Method2() { return Request.Method + " " + Request.Path; } #endregion #region (x.7)ApiClient #region (x.x.1)ApiClient示例,调用其他接口 /// /// ApiClient示例,调用其他接口 /// /// [HttpPost("700/ApiClient700")] public ApiReturn ApiClient700( [SsExample("/did_serslot/Values")] string apiRoute, [SsExample("{\"a\":\"aaa111\"}")] dynamic arg) { var apiRet = ApiClient.CallRemoteApi((string)arg.apiRoute,(object) arg.arg, "POST"); return new ApiReturn(new { RpcContext.RpcData, apiRet }); } #endregion #region (x.x.2)ApiClient示例,调用其他接口 /// /// ApiClient示例,调用其他接口 /// /// [HttpPost("702/ApiClient")] public ApiReturn ApiClient702() { return new ApiReturn(new { RpcContext.RpcData }); } [HttpPost("703/ApiClient")] public string ApiClient703() { var rpc=RpcContext.RpcData; var apiRet = ApiClient.CallRemoteApi("/did_serslot/v1/702/ApiClient", null,"POST"); return apiRet; } #endregion #endregion } }