解决参数不在同一文件下的问题:从 IActionResult 到异步请求

解决参数不在同一文件下的问题:从 IActionResult 到异步请求

在JavaScript函数中使用AJAX异步请求获取后台C#代码中的参数,如下:在前端开发中,JavaScript函数调用与后台C#代码提供参数之间的联系是非常重要的,需要用到一些技巧来解决参数不在同一文件中的问题,以保证程序的正常运行。

一、认识IHttpActionResult

哈喽!你用过ASP.NET Core里那个叫’IHttpActionResult’的东东吗?超赞的,处理HTTP请求全靠它。无论是GET还是POST都没问题。而且,它还能搞定JSON、XML这些格式的数据,真的很方便。尤其在做RESTful API时,这种格式的数据可是必备的哟。

哥们们,你们可要记住,IHttpActionResult这个大家伙里还隐藏着个小机灵鬼——OkResult!它就是告诉咱们请求成功的信号灯!这时候,服务器就会给咱们发个200的状态码,意思是“没问题,一切都好”。但是如果找不到资源或者请求出错了,也不用担心,NotFoundResult和BadRequestResult这两个小伙伴随时待命,看情况选一个就行~

二、使用[FromBody]和[FromQuery]特性

想搞定ASP.NET Core API控制器的请求参数怎么办?别慌,有两个属性[FromBody]和[FromQuery]帮你忙!前者在请求body里找,后者就在query string里拿哦~

比如说,来了个POST的请求,咋从里面搞出那个Person对象捏?简单得很!只需要加这几个字:public IActionResult Post([FromBody] Person person)。这时ASP.NET Core就会帮你搞定了,它会去解析请求里的JSON数据,然后自动把它们变成Person对象。

想用GET方法拿到personID吗?就这么简单!然后,根据约定,网线核心会帮你把查询字符串里的id换成int型的personId

三、处理参数不在同一文件下的问题

老是碰到“参数不见了”这种事,你烦不烦啊?比如前端的Javascript找不到后台的C#,咋整呀?别急,这就是我要告诉你的小技巧!

嘿 AJAX:其实我们自己不用来搞什么复杂流程,直接动动手利用AJAX技术就成啊!比如,在JS里轻轻一点,我们就可以轻松地从后台的C#代码那边拿到我们想要的数据。

javascript
function getParam() {
    $.ajax({
        url: '/api/person',
        method: 'GET',
        success: function(data) {
            console.log(data);
        }
    });
}

首先,在我们的后台C#那儿,把要用到的参数传到Cookie里。接着,就可以去JavaScript那一边,用document.cookie找出来并处理!举个例子,比如这么做:

//code here

“`csharp

Cookie里的”personId=123″是这么来的,原来我们只是把”personId”放进去而已。

然后在JavaScript中:

咱们得找个名叫’人ID’的东东!关键就在那些cookie里找含有一句’startwith=”personid=’的部分,然后再抓出那后面紧跟的一串数字就行。

console.log(personId);

HTML5中有个叫WebStorage的牛逼东西!咱们想要传的那些参数,都能偷偷藏在LocalStorage或者SessionStorage里面,然后再用JavaScript轻轻松松把它弄出来.就好比这样做:

把”123″存进本地存储的”personId”里去。

快来找出我的ID在哪里吧~就在这个本地存储里的「personId」这里!

四、处理复杂参数

当用到那些很复杂的API参数时(比如嵌套的对象或者数组之类),有几个小技巧可以帮到你!

直接把那些麻烦的参数扔进DTOSclass里头,再给API设置下接收位不就行?比如这样:

public class PersonDto

{

public int Id { get; set; }

名字就叫Name,可以随便改。

获取地址的公共成员:Address 用来存储和设置数据。

public class Address

共享的字符串变量:街道,是可以获取和设置的。

咱们这的公共属性City,可以随意访问和修改。

然后在API中:

记得这个接口传递的是叫personDto的东西,这个就是管理员用来处理我们在body里面传过来的PersonDto信息的。

// 处理personDto

看看我还能自定义个ModelBinder解决各种烦人的参数问题,比如嵌套对象什么的都不用怕了~

来给大家聊聊ModelBinder这个神器,也就是所谓的特殊IModelBinder!

听过这个没?就是绑定了模型和视图模板~

{

var person = new Person

{

我们把’Id’这个值从数据源里取出来,然后变成整数。

名字,简单说就是从那个叫BindingContext.ValueProvider里找到的头一个数值。

Address = new Address

{

这个地方就是咱们之前提到的那条街,位于”地址.街区”的首位。

城市就在“地址”那部分,去查下就知道了。

}

};

就直接给绑定上下文的结果加个”成功”,把这个人放进去。

return Task.CompletedTask;

}

[HttpPost]

这里收集你的个人信息超简单,直接把你的表单给我们在这个网址(http://www.example.com/persons)上一传就好啦!

// 处理person

五、处理参数验证

记住做API开发时别忘了做参数验证哦~也就是看看用户输入的参数格式、范围是否正确。ASP.NET Core里有许多便捷的验证特性,像是[Required]、[Range]、[StringLength]之类的,用起来超方便!

那么你知道吗,如果我们有个叫 Person 的朋友的话,那就不能让他们的姓名栏里是空白对?其实很简单,只需要这么做:

$.ajax({
    url: 'http://localhost:5000/api/person?id=1',
    type: 'GET',
    success: function(data){
        functionName(data);
    }
});

public class Person

[Required]

大家好,给我传下个人信息用POST的方式喔!

if (!ModelState.IsValid)

直接告诉他们“请求错误(模型状态)”就搞定。

六、处理异常

说到API开发,处理异常可不就是个坎儿吗?翻来覆去的异常得想办法解决,咱们的API才能稳稳地运行ASP.NET Core可是有很多好用的工具帮忙,像那个[ApiController]和ExceptionFilter就挺不错的。

接下来咱们聊聊这个[ApiController]是个啥玩意儿。有了它,好多问题都能迎刃而解哦:

[ApiController]

[Route(“api/[controller]”)]

这儿就有个名叫PersonController的控制器,这玩意儿是在它爸爸ControllerBase那儿学来的。

[HttpPost]

只需告诉我你在Person类上打了啥数据嘛! 记得把它放到Post查询里面!

// 处理person

此外,我们还能搞个Filter来抓取和处理自定义错误:

哈喽!这儿有个CustomExceptionFilter,解决问题就是小菜一碟!

碰到怪事了?OnException这招管用!

要是遇到CustomException的话,就这么办。

出错了!我得到了个bad request object result的消息,里面提示说犯错是因为exception的msg。

咱们就在 Startup.cs这儿加个 Exception Filter吧:

这儿,咱们只需把controller服务装进去就成了。

options.Filters.Add<CustomExceptionFilter>();

});

七、处理跨域请求

不用担心遇到跨域请求问题!简单操作就能解决,例如启用[EnableCors]或者设置CorsPolicy即可。

我们激活这个“启用CORS”的功能后,任何网站都能自由使用咱们的API!

[EnableCors(“AllowAll”)]

然后在Startup.cs中配置CorsPolicy:

services.AddCors(options =>

“选项里加上’允许所有’策略,这样就对了。”

builder.AllowAnyOrigin()

.AllowAnyMethod()

.AllowAnyHeader();

八、处理限流

想要提升API效率,其实很简单,试试“限流”功能呗!设定API只让特定次数请求不就行了,有效防止骚扰或服务器超负荷。现在市场上这类工具一大堆,比如用ASP.NET Core里的RateLimit中间件与RateLimitPolicy配置啥的。

我们都想知道,拿哪种RateLimit的插件能管住API的使用次数?

快来装个限速小助手!新版本的RateLimitOptions用起来更舒服!

把那个叫GlobalLimiter的东西搬到另一边,就是现在的ConcurrencyLimiter和其他相关的设定那里。

PermitLimit = 10,

QueueLimit = 5,

队列处理顺序设定成了”老大哥优先哦”!

})

[‘启用限速'(‘我的策略’)]

九、处理缓存

你平时是不是也喜欢用缓存模式?这样能增强API!通常我们会利用ASP.NET Core里的内置函数,像用ResponseCache特性或设置缓存profile之类的办法来实现。

ResponseCache就是个好帮手,它能帮我们缓存API返回结果哒~

咱们这儿搞个1分钟的缓存吧(就是60秒),定位就用默认那个就行了。

[HttpGet]

public IActionResult Get()

// 处理请求

然后在Startup.cs中配置CacheProfile:

你只需要把新的缓存设置塞到”默认”设置里,就搞定了!就是这么简单:options.CacheProfiles.Add(“默认值”, 新缓存配置)

Duration = 60,

位置就是回应有高速缓存的地方。

十、总结

搞定asp.net core API的参数,可不是件轻松事!要应对各种情况,如[FromBody]和[FromQuery]属性解决麻烦的参数,确保参数无误,处理可能出现的错误,跨域请求等,还得防止流量过大,合理利用缓存等。这样才能让我们的API更稳固,开发起来也更顺手!

咱说好了最后能不能跟我说一件事,那就是你们做项目时有没有遇到过API参数处理的困扰?后来是咋解决的?要是你有啥好办法就赶紧在评论区分享出来!别忘了给这篇文章点个赞,然后分享出去!

原文链接:https://www.icz.com/technicalinformation/web/2024/07/19242.html,转载请注明出处~~~

0

评论0

请先

注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
没有账号? 注册  忘记密码?