我正在尝试创建一个PUT调用来更新英雄资源。
如果我将值硬编码为字符串并传递给它,那么事情就很好了。 (初始化并将字符串h作为主体参数传递)
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
, 'Access-Control-Allow-Origin': '*'
})
};
/** PUT: update the hero on the server */
update(hero: Hero): Observable<any> {
console.log('in service.update');
var h: string = '{id:28,name:"g-man",alterEgo:"jeff",superPower:"can fly"}';
//hero
return this.http.put(this.heroesUrl, h, httpOptions).pipe(
tap(_ => this.log(`updated hero id=${hero.id}`)),
catchError(this.handleError<any>('updateHero'))
);
}
但是,如果我让Angular传入hero,则将调用webservice方法,但没有参数。
/** PUT: update the hero on the server */
update(hero: Hero): Observable<any> {
console.log('in service.update');
var h: string = '{id:28,name:"greg",alterEgo:"jeff",superPower:"eggs"}';
//hero
return this.http.put(this.heroesUrl, hero, httpOptions).pipe(
tap(_ => this.log(`updated hero id=${hero.id}`)),
catchError(this.handleError<any>('updateHero'))
);
}
这是网络服务方法
<HttpPut>
<Route("")>
Async Public Function update(<FromBody> mh As mHero) As Threading.Tasks.Task(Of CustomJsonStringResult)
Dim requestBody As String = Await Request.Content.ReadAsStringAsync()
Dim ag As New HeroSuperAg
Dim h As Hero = ag.GetById(mh.id)
h.name.Value = mh.name
h.alterEgo.Value = mh.alterEgo
h.superPower.Value = mh.superPower
h.Save()
Return JsonStringResultExtension.JSONString(Me, h.JSON, HttpStatusCode.OK)
End Function
当我停止使用Angular发送参数的代码时,可以检查hero并获取
,但该方法传递了一个为null的参数。
当我传递字符串时,会传递一个参数,它是我可以使用的正确的json英雄对象。
我已经检查了服务中请求对象的每个可用属性。无论哪种情况,我都看不到内容,无论是在request.content中还是在标头中。
我相信这可能是我需要传递的一些配置参数,但是它在逃避我。
这不是CORS问题。
为什么Angular不会将FORM变量的JSON表示传递回Web服务上的PUT METHOD
这是DevTools-网络标签(Chrome)的图片 这是在我按照建议将内容传递为JSON.stringify(hero)
之后答案 0 :(得分:0)
按照@CyberCyclist和@PrishantPimpale的建议,我将内容更改为JSON.Stringify(hero)。这解决了问题。
我按要求粘贴了网络截图。 (我不知道此调试资源...谢谢)
奇怪的是...我想结束这篇文章,看看它在错误状态下是什么样子,所以我将呼叫改回了简单地传递给英雄。 现在我不能让它失败。
this.http.put(this.heroesUrl, hero, httpOptions)
and
var hjson: string = JSON.stringify(hero) this.http.put(this.heroesUrl, hjson, httpOptions)
两者均按预期工作。