ОПУБЛИКОВАТЬ 2 параметра Guid в API с помощью Angular

#c# #angular #typescript #asp.net-core #asp.net-web-api

#c# #angular #typescript #asp.net-ядро #asp.net-web-api

Вопрос:

Я создал API для отслеживания пользователя. Метод принимает 2 параметра, которые являются двумя идентификаторами guid. Метод:

 // Follow user
[HttpPost]
public async Task<ActionResult<Guid>> FollowUser([FromBody] Guid user_gd, Guid user2_gd)
{
  if (ModelState.ErrorCount > 0)
  {
    return BadRequest();
  }
  var followedUser = await _user.FollowUser(user_gd, user2_gd);
  return Ok(followedUser);
}
  

Менеджер в API:

 public async Task<bool> FollowUser(Guid user_gd, Guid user2_gd)
        {
            var followUserQuery =
                @"
                    insert into userbind(gd, user_gd, followed_user_gd, date_followed) 
                    values(@_gd, @_user_gd, @_followed_user_gd, @_date_followed)
                ";
            await PostQuery(followUserQuery, new
            {
                _gd = GenerateGd(),
                _user_gd = user_gd,
                _followed_user_gd = user2_gd,
                _date_followed = DateTime.Now
            });

            return true;
        }
  

Запрос API в Angular (сервис):

 followUser(followed_user, user_gd): Observable<any> {
    try {
      return this._http.post<any>(this._apiUrl   "FollowUser", { "user2_gd": followed_user, "user_gd": user_gd }, this.httpOptions);
    } catch (e) {
      console.log("POST error: ", e);
    }
  }
  

Компонент:

 followUser(gd) {
    console.log(gd);
    this._userService.followUser(gd, localStorage.getItem("gd")).subscribe(
      res => {
        console.log(res);
      }
    )
  }
  

Переменные и все работает прямо сейчас, но я каждый раз получаю эту ошибку:

«Невозможно десериализовать текущий объект JSON (например, {«name»:»value»}) в тип ‘System.Guid’, потому что для правильной десериализации типа требуется примитивное значение JSON (например, строка, число, логическое значение, null).r пчтобы исправить эту ошибку, либо измените JSON на примитивное значение JSON (например, string, number, boolean, null), либо измените десериализованный тип, чтобы он был нормальным.Тип NET (например, не примитивный тип, такой как integer, а не тип коллекции, такой как array или List), который может быть десериализован из объекта JSON. Атрибут JsonObjectAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из объекта JSON.r NPath ‘user2_gd’, строка 2, позиция 15.»

Кто-нибудь знает, как это исправить, или сталкивается с той же проблемой? Пожалуйста, свяжитесь с нами.

Ответ №1:

Попробуйте создать класс с обязательными полями и принять его в своем FollowUser действии в качестве параметра:

 public class FollowUserParams
{ 
    public Guid user_gd { get; set; }
    public Guid user2_gd { get; set; }
}

// Follow user
[HttpPost]
public async Task<ActionResult<Guid>> FollowUser([FromBody] FollowUserParams p)
{
   ... use p
}
  

Также см. Сообщение Эндрю Локка о привязке модели в ASP.

Комментарии:

1. Итак, в моем менеджере мне нужно будет заполнить созданный вами класс и вернуть его?

2. @AntonioSk Вы можете просто передать ему значения, например await _user.FollowUser(p.user_gd, p.user2_gd)

3. Где я должен заполнить класс?

4. @AntonioSk нигде. ASP сделает это за вас, когда FollowUser будет вызвано ваше действие в контроллере. Он попытается привязать параметры, которые вы передаете в теле запроса (в angular), к этому классу (насколько я вижу, у вас сейчас не получается).

5. Братан, большое спасибо!!! Сначала я вас не понял, но сейчас это работает, спасибо, чувак!