Asp.net ядро: действие с необработанным строковым параметром

#json #asp.net-core #asp.net-web-api

#json #asp.net-core #asp.net-web-api

Вопрос:

Я пытаюсь написать действие с необработанным строковым параметром.

Эта строка будет динамически обрабатываться как json, поэтому ключи в json не известны во время компиляции.

Я объявил метод таким образом:

 [HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
{
    var cmd = MyCqrsCommand(command);
    return await Mediator.Send(cmd);
}
  

Я вызываю метод с помощью swagger, который показывает параметр как application / json

введите описание изображения здесь

Результат таков

 {
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|4e0e9c40-4036f8a9873ecac8.",
  "errors": {
    "$": [
      "The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
    ]
  }
}
  

Я нашел два разных решения:

 [HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
    
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction(string command)
{ ... }
  

Использование объекта не элегантно, но оно работает.
Использование «string» в uri имеет некоторые ограничения, поэтому я предпочитаю предыдущее.

Какое из них является лучшим решением? И есть ли способ вставить строку в тело, объявленное как string, а не как object?

Ответ №1:

Используйте JSONObject в качестве входного параметра вместо string и object .

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

1. Хорошо, но для этого, похоже, требуется определенная структура json (от swagger): { «count»: 0, «item»: [ null ], «jsonType»: 0, «keys»: [ «string» ], «values»: [ [ null ] ] }; Я предпочитаюиметь свободный json для анализа. Возможно ли это?

Ответ №2:

Какое из них является лучшим решением?

Я предпочитаю использовать решение с параметром объекта.

 [HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
  

На скриншоте вашего запроса мы видим, что вы отправили объект JSON { "key": "value" } в свой MyAction метод. Поэтому вы не должны объявлять свой параметр как string .

И есть ли способ вставить строку в тело, объявленное как string, а не как object?

Если вы ожидаете использовать «string» в качестве входного параметра, просто отправьте содержимое value .

     [HttpPost("/MyAction")]
    public async Task<ActionResult<long>> MyAction([FromBody] string command)
  

введите описание изображения здесь

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

1. Вы отправили "value" неверный json, который обычно отправляется. Попробуйте отправить тело с допустимым json, и вы увидите, что ваше решение не работает