PUT 和 POST 方法在 Postman 中有效,但只有 POST 在 Angular 10 中有效

PUT and POST methods work in Postman but only POST works in Angular 10

这在我的“编辑-continent.component.ts”

    addContinent(continentData) {
        this.continent.name = continentData.name;
        this.continentService.addContinent(this.continent).subscribe((response) => {
          (data) =>
            (this.continent = {
              id: (data as any).id,
              name: (data as any).name,
            });
          this.ngOnInit(), this.continentForm.reset();
        });
      }
    
      editContinent(continentData) {
        this.continent.id = this.continentId;
        this.continent.name = continentData.name;
    
        console.log(`${this.continentId}`);
        console.log(`${continentData.name}`);
        console.log(this.continent);
    
        this.continentService.editContinent(this.continent).subscribe((response) => {
          (data) =>
            (this.continent = {
              id: (data as any).id,
              name: (data as any).name,
            });
          this.ngOnInit(), this.continentForm.reset();
        });
      }

(the console.logs all print what they are suppose to)

This is my "continent.service.ts"

    addContinent(continent: Continent): Observable<Continent> {
        return this.http
          .post<Continent>(this.url, continent, httpOptions)
          .pipe(retry(2), catchError(this.handleError)); //tenta novamente por 2x
      }
    
      editContinent(continent: Continent): Observable<Continent> {
        const apiurl = `${this.url}/${continent.id}`;

        console.log(continent);
        console.log(apiurl);

        return this.http
          .put<Continent>(apiurl, continent, httpOptions)
          .pipe(retry(2), catchError(this.handleError));
      }

(console.logs 也打印他们应该打印的内容) 这在我的网站 API Visual Studio 中(使用 Dapper 和 SQL 服务器)

    [HttpPost]
            public IActionResult PostContinent (Continent continent)
            {
                int i = ContinentRepository.PostContinent(continent);
                continent.Id = i;
                if (i > 0)
                    return Ok(continent);
                return NotFound();
            }

    [HttpPut("{id}")]
    public IActionResult PutContinent(long id, Continent continent)
    {
        Console.WriteLine(id.ToString(), continent);
        if (id != continent.Id)
            return BadRequest();

        int i = ContinentRepository.PutContinent(continent);
        if (i > 0)
            return Ok(continent);
        return NotFound();
    }

他们在 Postman 中工作,但只有 POST 方法在 Angular 中工作,PUT 方法给我这个错误:

    X PUT https://localhost:44306/continent/4 400
    X Backend returned code 400, body was: [object Object]
    X Uncaught TypeError: Cannot read property 'ngOriginalError' of undefined
        at getOriginalError (core.js:4346)
        at ErrorHandler._findOriginalError (core.js:4418)
        at ErrorHandler.handleError (core.js:4395)
        at Object.next (core.js:28037)
        at SafeSubscriber.schedulerFn [as _next] (core.js:24851)
        at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
        at SafeSubscriber.next (Subscriber.js:122)
        at Subscriber._next (Subscriber.js:72)
        at Subscriber.next (Subscriber.js:49)
        at EventEmitter_.next (Subject.js:39)

我的 api

的启动中也有 AddCors
    public void ConfigureServices(IServiceCollection services)
            {
                [...]
                services.AddCors(c =>
                {
                    c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
                });
                services.AddControllers();
            }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                app.UseCors(options => options.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
    [...]
    }

我尝试了几种不同的方法,但不知道为什么会给我这个错误,我想是关于我作为参数传递的对象“大陆”的问题,但因为它适用于 POST (也适用于 GET 和 DELETE,但我认为它不相关)我不明白为什么它不适用于 PUT

编辑: 我尝试在 [HttpPut("{id}")] 中使用 [FromBody] 但它没有用。当使用 dynamic 而不是 Continent 时,可以看到它得到:

ValueKind = Object : "{"id":"90002","name":"oi"}"
error CS0726: ':' is not a valid format specifier

我该怎么办?

在你的位置,你需要告诉它大陆来自 body。

public IActionResult PutContinent(long id, [FromBody]Continent continent)

嗯,原来是我发送的id类型。它是字符串格式而不是长格式,但我之前没有注意到。这解决了问题。

editContinent(continentData) {

    this.continent.id = Number(this.continentId);
    this.continent.name = continentData.name;

    this.continentService
      .editContinent(this.continent)
      .subscribe((data : Continent) =>
      {
          this.continent = data;
          this.continentForm.reset();
      });
  }