我在这个问题上苦苦挣扎了很长时间。
我有一个用Angular 6和WebApi创建的客户端应用程序,该应用程序是用ASP Core 2.1创建的。
对于我的POST请求,我要做类似的事情。
const params = {
TestData: newActions,
ExportAndExecute: true
};
this.httpClient.post('/tests/export', params, {headers: {}}).subscribe((result) => {
console.log(result);
});
其中httpClient.post方法为:
post(route: string, params: any, headers: object) {
return new Observable<any>(subscriber => {
this.httpClient.post<any>(this.baseUrl + route, params, headers).subscribe((result) => {
subscriber.next(result);
}, (error: Response) => {
this.handleRequestError(error);
});
});
}
我的API控制器操作如下:
[HttpPost]
[Route("/api/[controller]/export")]
[Authorize(AuthenticationSchemes = "JwtBearer")]
public async Task<HttpStatusCode> ExportTest( [FromBody] ExportTestModel model)
{
var result = HttpStatusCode.MisdirectedRequest;
}
模型类是:
public class ExportTestModel
{
public List<BsonDocument> TestData { get; set; }
public bool ExportAndExecute { get; set; }
}
我不知道为什么每次我从客户端发送数据时,在控制器操作中它为null。我试图将其作为字符串对象发送,在控制器中以object
或JObject
的形式接收,但没有任何效果。
我可以补充一点,如果我以JObject
的身份接收数据,则可以正确看到它,但我不想这样做。
我感到很愚蠢,但也许有人可以指出我在我的方法中做错了什么。
答案 0 :(得分:1)
看看您的示例代码,我跳到两个选择:
错误的标题。因为您显式地将一个空的标头对象设置为第三个参数,所以可能导致Angular不为要发送的内容类型(application / json)添加默认的HTTP标头。如果您不告诉ASP.NET Core您要发送哪种数据,则ASP.NET Core不会在乎它,也不应用模型绑定。解决此问题的方法非常简单,只需在您的this.httpClient.post()
调用中删除第三个参数即可。
this.httpClient.post('/tests/export', params).subscribe(result => {
console.log(result);
});
您可以通过检查Web开发人员工具栏中的网络流量来验证是否设置了此标头。
区分大小写。在JavaScript(以及JSON)中,骆驼框是标准的。您的params
对象有一个TestData
和一个ExportAndExecute
,两者均以pascal大小写。可能是模型联编程序对大小写敏感。
答案 1 :(得分:0)
这对我使用Angular 6 HttpClient和Asp.Net Core 2.0或2.1有用
在您的控制器中:
import animals.Dog;
import animals.Eagle;
import animals.IAnimal;
public class Test {
public static void main(String[] args) {
IAnimal dog = new Dog();
IAnimal eagle = new Eagle();
dog.feed();
eagle.feed();
}
}
为您服务:
const params = {
TestData: newActions,
ExportAndExecute: true
};
this.dataService.postData(params).subscribe(
data => {
console.log('post OK !');
},
error => {
console.log('post error !');
}
);