.NET Core 3.1 Web Api 如何跨域以及Post请求
.NET Core 3.1 Web Api 如何跨域以及Post请求
文章目录
前言
.net core 3.1 如何跨域以及如何通过post取值
一、如何跨域?
一级标题
1、配置startup.cs文件
首先配置ConfigureServices方法
//此方法由运行时调用。使用此方法向容器中添加服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//获取appsettings.json配置信息
var config = new ConfigurationBuilder()
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
//获取允许跨域的域名配置
var alloweHosts = config["AllowedHosts"];
//配置跨域处理
services.AddCors(options=>
{
options.AddPolicy("cors", builder =>
{
//允许所有Origin策略
builder.WithOrigins(alloweHosts)
.AllowAnyOrigin()
//允许所有请求方法Get,Post,Put,Delete
.AllowAnyMethod()
//允许所有请求头 appliction/json
.AllowAnyHeader();
//指定处理cookie,这个在.netcore 2.1的时候能用,而打了3.1就用不了了
//.AllowCredentials();
});
});
}
然后配置Configure方法
注意的是app.UseCors()方法必须在 app.UseRouting()之后,在app.UseAuthorization()之前,app.UseCors()里的参数需和上面ConfigureServices中AddPolicy设置的相同
//此方法由运行时调用。使用此方法配置HTTP请求管道。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//而判断env.isDevelopment() 表示, 这个middleware只会在Development环境下被调用。
if (env.IsDevelopment())
{
//就是一个middleware(中间件), 当exception(报错)发生的时候, 这段程序就会处理它.
app.UseDeveloperExceptionPage();
}
else
{
/*在正式环境中, 我们遇到exception的时候, 需要捕获并把它记录(log)下来,
这时候我们应该使用这个middleware: Exception Handler Middleware, 我们可以这样调用它:*/
app.UseExceptionHandler();
}
app.UseCorsAllowOrigin();
app.UseHttpsRedirection();
app.UseRouting();
//启用跨域
app.UseCors("cors");
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
//由于路由现在包括对不止是 MVC 的支持,已更改了术语进行明确说明他们所做的这些方法。
//MapControllers 添加了对属性路由的控制器支持。
//MapAreaControllerRoute 将控制器的传统路由添加区域。
//MapControllerRoute 添加控制器的常规路由。
endpoints.MapControllers();
});
}
最后则是在控制器中的引用
在控制器类上面加标识[EnableCors(“cors”)]
[EnableCors("cors")]
public class UserLoginController : Controller
{
}
二、如何进行Post传值?
跨域后直接进行Post请求,前端Post请求写法如下,这里用的uni-app封装的请求方法:
uni.request({
url:"https://localhost:44379/api/UserLogin/ValidateLogon",
dataType:"JSON",
method:"POST",
header:{
'content-type': 'application/x-www-form-urlencoded'
},
data:{
login:_this.userInfo.Login
},
success:(res)=>{
console.log(res.data);
}
})
接口代码如下:
[HttpPost("ValidateLogon")]
public IActionResult ValidateLogon(string login)
{
var results = db.UserInfos.FirstOrDefault(u => u.Login == login);
if (results is null)
{
return NotFound();
}
return Ok(results);
}
如果在控制器上加了[ApiController]标识,会发现前端传递过来的参数为NULL,此时有两种解决方案:
1、把接口控制器的[ApiController] 改成 [Controller] 就能正常获取参数。
2、加了[ApiController]的情况下,post传递过来的参数在前面加上[FromForm],代码如下:
[HttpPost("ValidateLogon")]
public IActionResult ValidateLogon([FromForm] string login)//这里加上[FromForm]
{
var results = db.UserInfos.FirstOrDefault(u => u.Login == login);
if (results is null)
{
return NotFound();
}
return Ok(results);
}
Tips:在core里面
FromBody对应的是application/json或xml这种格式。
FromForm对应的www-for或者form-data这种格式。
传递参数时注意格式。