Núcleo Asp.net: ação com parâmetro de string bruto
Estou tentando escrever uma ação com um parâmetro de string bruto.
Esta string será analisada dinamicamente como um json, portanto, as chaves no json não são conhecidas no momento da compilação.
Eu declarei o método desta forma:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
{
var cmd = MyCqrsCommand(command);
return await Mediator.Send(cmd);
}
Eu chamo o método com arrogância que mostra um parâmetro como application / json
O resultado é este
{
"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."
]
}
}
Encontrei duas soluções diferentes:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction(string command)
{ ... }
Usar objetos não é elegante, mas funciona. Usar "string" no uri tem algumas limitações, então prefiro o anterior.
Qual é a melhor solução? E existe uma maneira de inserir a string no corpo declarado como string e não como objeto?
Respostas
Qual é a melhor solução?
Prefiro usar a solução de parâmetro de objeto.
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
Pela captura de tela da sua solicitação, podemos ver que você enviou um objeto JSON { "key": "value" } para o seu MyActionmétodo. Portanto, você não deve declarar seu parâmetro como string.
E existe uma maneira de inserir a string no corpo declarado como string e não como objeto?
Se você pretende usar "string" como parâmetro de entrada, basta enviar o conteúdo do valor.
[HttpPost("/MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
Use JsonObject como um parâmetro de entrada em vez de string e objeto.