Как создать [HttpPost], который может получать объект?

Я хочу отправить объект через HttpResponseMessage из кода на стороне клиента, прочитать этот объект на стороне сервера и сохранить вместе с ним userId.

Моя клиентская часть выглядит так:

public async Task<ViewResult> Add(Car car)
{
        Car c;

        using (Database db = new Database())
        {
            c = db.Cars.First(x => x.Id == car.Id);
        }

        HttpClient client = new HttpClient();
        string json = JsonConvert.SerializeObject(c);
        HttpContent httpContent = new StringContent(json);           

        string url = "https://localhost:5001/api/cars/Saved/userId = " + AccountController.curentUser;    
        HttpResponseMessage response = await client.PostAsync(url, httpContent);

        return View("~/Views/Car/PreviewCar.cshtml");
}

а на стороне сервера это должно выглядеть примерно так

[HttpPost("Saved/userId = {userId}")]
public async Task<ActionResult<CarS>> PostSavedCar(string userId) 
{
        // car = get from client side 

        car.UserId = userId;
        _context.SavedCars.Add(car);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetSavedCar", new { id = car.Id }, car);
}

Я не знаю, что я должен поместить в этот раздел комментариев, чтобы получить объект, а затем десериализовать его?


person Timotej Arnuš    schedule 13.05.2020    source источник
comment
Я не понимаю, где вы говорите серверу ожидать JSON. Возможно, взгляните на этот Send JSON через POST в C# и получить возвращенный JSON?   -  person Barns    schedule 13.05.2020


Ответы (1)


В вашем клиенте установите тип контента json:

HttpContent httpContent = new StringContent(json, Encoding.UTF8,"application/json"); 

И ваш Апи:

[HttpPost("Saved/userId = {userId}")]
public async Task<ActionResult<CarS>> PostSavedCar([FromBody]Car car, string userId) 
{
       car.UserId = userId;
        _context.SavedCars.Add(car);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetSavedCar", new { id = car.Id }, car);
}

На самом деле вам не нужно отдельно передавать userId - почему бы не установить car.UserId на стороне клиента, поскольку вы уже знаете, какое это значение (или, что еще лучше, установить его на стороне сервера)? Таким образом, вы можете просто передать автомобиль в теле запроса.

person auburg    schedule 13.05.2020
comment
Я пробовал это, но если я добавлю в метод дополнительные параметры, моя клиентская сторона вернет код 415 - «Неподдерживаемый тип носителя». - person Timotej Arnuš; 13.05.2020
comment
Я отредактировал свой ответ - вам нужно установить тип контента на application/json - person auburg; 14.05.2020