Как отправить сложные данные в конечную точку контроллера

У меня такой базовый случай:

    [HttpPost("endpoint")]
    public IActionResult Endpoint(DateTime date, string value, bool modifier)
    {
        return Ok($"{date}-{value}-{modifier}");
    }

и я могу отправить ему запрос с

    var testContent = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        { "date", DateTime.Today.ToShortDateString() },
        { "value", "value1" },
        { "modifier", true.ToString() }
    });

Вместо этого я хочу, чтобы моя конечная точка была такой

    [HttpPost("endpointwithlist")]
    public IActionResult EndpointWithList(DateTime date, List<string> value, bool modifier)
    {
        return Ok($"{date}-{value.FirstOrDefault()}-{modifier}");
    }

Как мне это послать? Я пробовал следующее, ничего не работает

    var json = JsonConvert.SerializeObject(new { date, value = valueCollection.ToArray(), modifier });
    var testContentWithList = new ByteArrayContent(Encoding.UTF8.GetBytes(json));
    testContentWithList.Headers.ContentType = new MediaTypeHeaderValue("application/json");

person robola    schedule 18.04.2020    source источник


Ответы (2)


Вы можете создать класс модели для полезной нагрузки

public class EndpointWithListModel
{
    public DateTime Date {get; set;}
    public List<string> Value {get; set;}
    public bool Modifier {get; set;}
}

тогда параметр метода может использовать атрибут [FromBody]

public IActionResult EndpointWithList([FromBody]EndpointWithListModel model)

затем отправьте json в свой метод POST, например, здесь . Использование HttpClient:

using (var client = new HttpClient())
{
    var response = await client.PostAsync(
    "http://yourUrl", 
     new StringContent(json, Encoding.UTF8, "application/json"));
}
person Martin Staufcik    schedule 18.04.2020
comment
Это сработало. Я действительно пробовал это, но мне не хватало атрибута [FromBody]. - person robola; 18.04.2020
comment
Есть ли способ заставить его работать, если я не могу изменить конечную точку? - person robola; 18.04.2020
comment
[FromBody] можно использовать также с простыми параметрами (строки, целые числа ..), я не знаю, можно ли использовать несколько атрибутов FromBody в одном методе, вероятно, это невозможно, в запросе только одно тело. - person Martin Staufcik; 18.04.2020
comment
Вы правы, из microsoft docs не следует передавать более одного параметра для каждого метода. Спасибо за вашу помощь. - person robola; 19.04.2020

если ваши переменные (date, valueController и модификатор) имеют правильный тип, следующий код должен работать.

  var json = JsonConvert.SerializeObject(new { date:date, value : valueCollection.ToArray(), modifier:modifier });
person zekeriya kocairi    schedule 18.04.2020
comment
Вопрос в том, как мне отправить эту строку json на контроллер? - person robola; 19.04.2020
comment
Вы сказали: «Как мне это послать? Я пробовал следующее, ничего не работает ». Я имел в виду, что вы должны исправить этот код, который не работает с тем, который я написал выше. - person zekeriya kocairi; 19.04.2020