角度未将主体传递到PUT方法

时间:2019-07-05 12:28:34

标签: javascript angular typescript

我正在尝试创建一个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并获取 inspection of hero variable

,但该方法传递了一个为null的参数。

当我传递字符串时,会传递一个参数,它是我可以使用的正确的json英雄对象。

我已经检查了服务中请求对象的每个可用属性。无论哪种情况,我都看不到内容,无论是在request.content中还是在标头中。

我相信这可能是我需要传递的一些配置参数,但是它在逃避我。

这不是CORS问题。

为什么Angular不会将FORM变量的JSON表示传递回Web服务上的PUT METHOD

这是DevTools-网络标签(Chrome)的图片 enter image description here 这是在我按照建议将内容传递为JSON.stringify(hero)

之后

1 个答案:

答案 0 :(得分:0)

按照@Cyber​​Cyclist和@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)

两者均按预期工作。