Asp.net core: azione con parametro stringa non elaborato

Sep 18 2020

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

1 MichaelWang Sep 25 2020 at 14:17

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)

1 mtkachenko Sep 18 2020 at 15:41

Usa JsonObject come parametro di input invece di stringa e oggetto.