我正在尝试使用angularJS 2 http的post方法。
我的休息电话如下:
saveCourse(Course: any) {
let url ='https://server/CoursesWebApi/api/courses/insert';
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
let options = new RequestOptions({ headers: headers});
return this._http.post(url, { data: Course }, options)
.toPromise()
.then(res => res.json().data)
.catch((err: any) => {
console.log(err);
return Promise.reject(err);
});
}
当字符串化时,课程对象如下所示:
{“标题”:“测试标题”,“AuthorId”:“Software”,“类别”:“软件体系结构”,"CourseLength":"2","CourseId":"test-id"}“
我试过了紧张版和非紧张版。在使用chrome进行调试时,两个版本都会出现以下错误:
响应状态:0表示URL: null
据我所知,0(0)的状态意味着它从未到达webapi服务器。我启用了CORS,并且在示例reactJS应用程序中使用了类似的方法,使用了axios并调用了相同的webapi,它可以工作。我安装了失眠症json工具,并使用以下json格式执行了post,它起了作用:
{ "CourseId":"steve","AuthorId":"cory-house","Title":"Test Title","CourseLength":"12:40",“AuthorId”:"Test类别“}
我不知道我做错了什么。我的asp.net webapi是这样的:
[HttpPost]
[Route("CoursesWebApi/api/courses/insert/")]
public IActionResult PostCourse([FromBody] Course course)
{
if (!ModelState.IsValid)
{
return HttpBadRequest(ModelState);
}
_context.Course.Add(course);
try
{
_context.SaveChanges();
}
catch (DbUpdateException)
{
if (CourseExists(course.CourseId))
{
return new HttpStatusCodeResult(StatusCodes.Status409Conflict);
}
else
{
throw;
}
}
return Ok();
}
最后,当我使用fiddler时,我在web上看到了以下错误:
HTTP/1.1 400坏请求内容-类型: application/json;charset=utf-8 Server: Kestrel X驱动-By: ASP.NET访问-控制-允许-来源:*访问-控制-允许-标题:内容-类型,接受,X请求-与,X-文件-名称访问-控制-允许-方法:获取,发布日期: Sun,2017年1月1日16:15 GMT内容-长度: 37 {“”:“不支持的内容类型‘’”}
我尝试过许多不同的post方法,但都没有效果。为此工作了三天,所以任何帮助都是非常感谢的。
编辑I无法解决这个问题。我的web使用了新的asp.net核心和EF 7,我用EF 6和ASP.Net 4.5.2重写了它,它工作了。我怀疑我的web中有什么东西是导致这个问题的原因。
发布于 2017-01-01 18:03:35
压缩数据
var body = JSON.stringify(Course);
在发送之前
_http.post(url, body, options)
还删除[FromBody]
属性。它用于从复杂对象中提取简单类型。
参考资料:ASP.NET Web中的参数绑定
行动会以这样的结果结束
[HttpPost]
[Route("CoursesWebApi/api/courses/insert/")]
public IActionResult PostCourse(Course course) { ... }
发布于 2017-01-01 17:53:14
您需要在正文中发送数据,因为PostCourse api方法将在FromBody中查看。
//public IActionResult PostCourse([FromBody] Course course)
下面是一个使用可观察到的例子:
public saveCourse(Course: any): Observable<Course> {
let url ='https://server/CoursesWebApi/api/courses/insert';
let body: string = JSON.stringify(Course);
let headers = new Headers();
let headers.append('Content-Type', 'application/json');
let options = new RequestOptions({ headers: this.headers });
return this.authHttp.put(this.url, body,options)
.map((res: Response) => {
return res;
})
.catch((error: any) => {
// Error on post request.
return Observable.throw(error);
});
}
发布于 2017-01-01 23:14:08
如果您已经启用了chrome中的CORS,尝试将访问控制-允许-原产地,*添加到您的标题。也有类似的问题,这很有帮助。
https://stackoverflow.com/questions/41417446
复制相似问题