Asp.net core: azione con parametro stringa non elaborato
Sto cercando di scrivere un'azione con un parametro di stringa non elaborato.
Questa stringa verrà analizzata dinamicamente come json, quindi le chiavi nel json non sono note al momento della compilazione.
Ho dichiarato il metodo in questo modo:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
{
var cmd = MyCqrsCommand(command);
return await Mediator.Send(cmd);
}
Chiamo il metodo con spavalderia che mostra un parametro come application / json
Il risultato è questo
{
"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."
]
}
}
Ho trovato due diverse soluzioni:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction(string command)
{ ... }
Usare l'oggetto non è elegante ma funziona. L'uso di "string" in uri ha alcune limitazioni, quindi preferisco il precedente.
Qual è la soluzione migliore? E c'è un modo per inserire la stringa nel corpo dichiarato come stringa e non come oggetto?
Risposte
Qual è la soluzione migliore?
Preferisco usare la soluzione dei parametri dell'oggetto.
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
Dallo screenshot della tua richiesta possiamo vedere, hai inviato un oggetto JSON { "key": "value" } al tuo MyActionmetodo. Quindi non dovresti dichiarare il tuo parametro come string.
E c'è un modo per inserire la stringa nel corpo dichiarato come stringa e non come oggetto?
Se prevedi di utilizzare "string" come parametro di input, invia semplicemente il contenuto di value.
[HttpPost("/MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
Usa JsonObject come parametro di input invece di stringa e oggetto.