我正在尝试使用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);
});
}
课程对象在进行字符串化时,如下所示:
" {" Title":" Test title"," AuthorId":" scott-allen",&#34 ;分类":"软件 架构"" CourseLength":" 2"" CourseId":"测试-ID"}"
我已尝试过字符串化和非字符串化版本。当我在chrome中调试时,我得到两个版本的以下错误:
状态响应:URL为0:null
据我所知,状态为0(零)意味着它甚至从未进入过webapi服务器。我启用了CORS,我在示例reactJS应用程序中使用类似的方法,使用axios并调用相同的webapi,它可以工作。我安装了失眠的json工具,并使用以下json格式执行了帖子,它起作用了:
{ " CourseId":"史蒂夫", " AuthorId":" cory-house", "标题":"测试标题", " CourseLength":" 12:40", "类别":"测试类别" }
我不确定我做错了什么。我的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 api上看到以下错误:
HTTP / 1.1 400 Bad Request Content-Type:application / json;字符集= utf-8的 服务器:Kestrel X-Powered-By:ASP.NET Access-Control-Allow-Origin:* Access-Control-Allow-Headers:Content-Type,Accept,X-Requested-With, X-File-Name访问控制允许方法:GET,POST日期:Sun,01 Jan 2017 16:15:15 GMT内容长度:37
{"":["不支持的内容类型''。"]}
我尝试了很多不同的post方法配置无济于事。已经工作了三天,所以感谢任何帮助。
修改 我无法解决问题。我的web api使用的是新的asp.net核心和EF 7.我使用EF 6和ASP.Net 4.5.2重写了它,并且它有效。我怀疑我的网络API中缺少一些导致问题的东西。
答案 0 :(得分:1)
对数据进行字符串化
var body = JSON.stringify(Course);
发送前
_http.post(url, body, options)
同时删除[FromBody]
属性。它用于从复杂对象中提取简单类型。
参考:Parameter Binding in ASP.NET Web API
行动将像这样结束
[HttpPost]
[Route("CoursesWebApi/api/courses/insert/")]
public IActionResult PostCourse(Course course) { ... }
答案 1 :(得分:0)
您需要发送正文中的数据,因为您的PostCourse api方法将在[FromBody]中查看
//public IActionResult PostCourse([FromBody] Course course)
以下是使用Observable的示例:
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);
});
}
答案 2 :(得分:0)
如果您已经在Chrome中启用了CORS,请尝试添加 Access-Control-Allow-Origin,*到你的标题。有类似的问题,这有帮助。