.Net 6 c# APi 和 Angular 之间的通信问题

Problem with comunication between .Net 6 c# APi and Angular

我在 .Net web 中有三个函数 api 在 .Net 6.

第一个:

    [HttpPost("name/{name}")]
    public async Task<ActionResult<Book>> PostOrder(string name, Book book)
    {
        try
        {
            var id = _context.Order.Where(el => el.User == name).Select(el => el.OrderID).FirstOrDefault();

            if (id > 0)
            {
                book.OrderID = id;
                _context.Book.Update(book);
                await _context.SaveChangesAsync();

                return book;
            }
            else
            {
                Order o = new()
                {
                    User = name
                };
                _context.Order.Add(o);
                await _context.SaveChangesAsync();

                id = _context.Order.Where(el => el.User == name).Select(el => el.OrderID).FirstOrDefault();

                book.OrderID = id;
                _context.Book.Update(book);
                await _context.SaveChangesAsync();

                return book;
            }  
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            return NotFound();
        }
    }

第二和第三

    [HttpPut("{id}")]
    public async Task<IActionResult> PutUser(int id, User user)
    {
        if (id != user.id)
        {
            return BadRequest();
        }

        _context.Entry(user).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!UserExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
    }

    // POST: api/Users
    [HttpPost]
    public async Task<ActionResult<User>> PostUser(User user)
    {
        _context.User.Add(user);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetUser", new { id = user.id }, user);
    }

我用来交流Angular: 第一:

addToOrder(user: string, book: Book): Observable<Book> {
 const url = `${this.orderUrl}/name/${user}`;
 return this.http.post<Book>(this.orderUrl, book, this.httpOptions).pipe(
   tap(_ => this.log(`added book to order for ${user}`)),
   catchError(this.handleError<Book>('addToOrder'))
 );
}

第二和第三:

updateUser(user: User): Observable<any> {
 const url = `${this.usersUrl}/${user.id}`;
 return this.http.put(url, user, this.httpOptions).pipe(
   tap(_ => this.log(`updated users id=${user.id}`)),
   catchError(this.handleError<any>('updateUser'))
 );
}

addUser(user: User): Observable<User> {
  return this.http.post<User>(this.usersUrl, user, this.httpOptions).pipe(
  tap((newUser: User) => this.log(`added user w/ id=${newUser.id}`)),
  catchError(this.handleError<User>('addUser'))
  );
}

首先没有工作。没有与.Net 通信,错误的数据在哪里?我找不到任何。 Mayby 参数不正确。但是我没有看到。任何其他功能正常工作,我已经响应并在调试中请求服务器但在第一次请求时没有。仅在 POSTMAN 或 SWAGGER 中。

我在 Angular 上有订单:

getOrder(user: string): Observable<Book[]> {
 const url = `${this.orderUrl}/name/${user}`;
 return this.http.get<Book[]>(url)
  .pipe(
   tap(_ => this.log(`fetched order for name=${user}`)),
   catchError(this.handleError<Book[]>('getBooks', []))
 );
}

正在努力。

当我尝试使用 Postman 或 Swagger 时,我看到了响应。

P.S 当我从以下地址复制调试地址时:

const url = `${this.orderUrl}/name/${user}`;

并尝试在邮递员中添加 Book in JSON:

{
 "bookID": 4,
 "title": "string2",
 "author": "strin2g",
 "isbn": "stri2ng"
 }

我已经回复了。

默认POST方法参数必须全部在请求体(FromBody).

GET方法参数必须全部在请求查询中(FromUri).

要更改此行为,您需要添加参数绑定。

.net Parameter Binding docs

变化

[HttpPost("name/{name}")]
public async Task<ActionResult<Book>> PostOrder(
    [FromUri] string name, 
    [FromBody] Book book)
{
    // CODE
}

好的。我有一个答案。我有一个:

   const url = `${this.orderUrl}/name/${user}`;
return this.http.post<Book>(this.orderUrl, book, this.httpOptions)

但必须是:

   const url = `${this.orderUrl}/name/${user}`;
return this.http.post<Book>(url, book, this.httpOptions)

问题的故事。我没注意到。