.Net Core是支持前后端不分离式的开发的,如果在原始系统中采用不分离式开发,后面需要在原系统中增加功能,并且新的服务采用其他语言开发,且系统原来功能保持原样,这样前端系统可以单独调用新开发的接口。
但是,如果该系统涉及到权限控制,因为Net Core前后端不分离可以获取到用户的登录信息,但是新的服务没有此功能,无法获取到用户的权限信息,这时就需要通过Net Core转调一次接口才行。
前端代码如下
$.ajax({
url: '/your/action',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
property1: 'value1',
property2: 'value2'
}),
success: function(response) {
console.log(response);
}
});
1. 使用FromBody特性
这是最推荐的方式,适用于JSON格式的请求体:
[HttpPost]
public IActionResult YourAction([FromBody] YourModel model)
{
// 直接使用model对象
// 调用其他语言写的接口
return Ok();
}
public class YourModel
{
public string Name { get; set; }
public int Age { get; set; }
}
2. 动态类型接收
如果不确定参数结构或想使用动态类型:
[HttpPost]
public IActionResult YourAction([FromBody] dynamic data)
{
string value1 = data.property1;
string value2 = data.property2;
// 调用其他语言写的接口
return Ok();
}
3. 直接从Request.Body读取
对于更复杂的场景,可以手动读取请求体:
[HttpPost]
public async Task<IActionResult> YourAction()
{
// 启用缓冲(如果还没有启用)
Request.EnableBuffering();
// 获取原始请求体
Request.Body.Position = 0;
using (var reader = new StreamReader(Request.Body))
{
// 获取Body参数
var body = await reader.ReadToEndAsync();
// 调用其他语言写的接口
}
return Ok();
}
4. 使用JObject解析
使用Newtonsoft.Json的JObject:
[HttpPost]
public IActionResult YourAction([FromBody] JObject data)
{
var model = data.ToObject<YourModel>();
// 或者直接访问属性
var value = data["propertyName"].Value<string>();
// 调用其他语言写的接口
return Ok();
}
注意事项
-
Content-Type头:确保前端设置了正确的
Content-Type
(通常为application/json
) -
模型绑定:确保你的模型类属性与前端发送的数据键名匹配
-
大小写敏感性:默认情况下.NET Core使用驼峰命名解析,可以通过配置改变:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; // 保持原样 });
-
异步读取:如果手动读取Request.Body,请确保使用异步方法
-
启用请求体缓冲:如果需要多次读取请求体,需要启用缓冲:
// 启用缓冲(如果还没有启用) Request.EnableBuffering(); // 获取原始请求体,在读取后总是重置 Request.Body.Position = 0,否则后续读取会得到空内容 Request.Body.Position = 0;