调用带模型参数的.NET Core API遇415错误,请求技术支持
问题:调用.NET Core API时收到415不支持的媒体类型错误
尝试从.NET Core API获取产品列表,但持续返回415错误,相关代码如下:
前端代码
service.ts
getProductList(listObj:any) { return this.http.get<any>(`${this.baseUrl}GetFilteredList`,listObj); }
component.ts
products:any= []; ngOnInit() { this.api.getProductList(this.products).subscribe({ next:(res)=>{ if(res.status){ this.products = res.record; } } })
component.html
<ul *ngFor="let product of products"> <li> {{product.subCategoryID}} </li> <li> {{product.categoryID}} </li> <li> {{product.price}} </li> <li> {{product.country}} </li> </ul>
后端API定义
接口方法
public ResultModel ProductList(ProductModel model) {
ProductModel示例
{ "subCategoryID": 0, "categoryID": 0, "key 3" : "" }
API返回结构
{ "status": true, "record": [ { "key1": 0, "key 2": 62, "key 3" : "string val" }, { "categoryID": 0, "saleListingID": 61, "key 3" : "string val" } ] }
错误原因
- GET请求参数传递错误:Angular的
HttpClient.get第二个参数是配置项,不是请求体。你直接传listObj不会被当作参数发送给后端。 - 后端参数读取方式不匹配:.NET Core默认会从请求体读取
ProductModel参数,但GET请求通常不包含请求体,后端无法解析参数,导致415错误。
解决方案
方案1:改用POST请求(推荐,适合复杂对象)
复杂筛选参数用POST传递更合理,避免查询字符串长度限制和拼接麻烦。
前端修改(service.ts)
getProductList(listObj:any) { // 用post方法传递请求体 return this.http.post<any>(`${this.baseUrl}GetFilteredList`, listObj); }
后端修改
添加[HttpPost]特性,指定从请求体读取参数:
[HttpPost("GetFilteredList")] public ResultModel ProductList([FromBody] ProductModel model) { // 业务逻辑代码 }
方案2:继续使用GET请求(适合简单参数)
如果必须用GET,需将对象参数转为查询字符串传递。
前端修改(service.ts)
import { HttpParams } from '@angular/common/http'; getProductList(listObj:any) { let params = new HttpParams(); // 遍历对象属性,转为查询参数 Object.keys(listObj).forEach(key => { if (listObj[key] != null && listObj[key] != undefined) { params = params.append(key, listObj[key].toString()); } }); return this.http.get<any>(`${this.baseUrl}GetFilteredList`, { params }); }
后端修改
添加[HttpGet]和[FromQuery]特性,从查询字符串读取参数:
[HttpGet("GetFilteredList")] public ResultModel ProductList([FromQuery] ProductModel model) { // 业务逻辑代码 }
注意事项
- 确保前后端模型的属性名完全一致(.NET Core默认区分大小写,可配置忽略大小写)。
- POST请求无需额外设置
Content-Type,Angular的HttpClient.post默认会使用application/json。 - 可先用Postman测试后端接口,确认接口正常后再调试前端。
内容的提问来源于stack exchange,提问作者Aaa a12
相关产品推荐
相关产品推荐

