Asp.net core: tindakan dengan parameter string mentah
Saya mencoba menulis tindakan dengan parameter string mentah.
String ini akan diurai secara dinamis sebagai json, jadi kunci di json tidak diketahui pada waktu kompilasi.
Saya menyatakan metode dengan cara ini:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
{
var cmd = MyCqrsCommand(command);
return await Mediator.Send(cmd);
}
Saya menyebut metode dengan swagger yang menunjukkan parameter sebagai application / json
Hasilnya begini
{
"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."
]
}
}
Saya menemukan dua solusi berbeda:
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction(string command)
{ ... }
Menggunakan objek tidak elegan tetapi berhasil. Menggunakan "string" di uri memiliki beberapa keterbatasan, jadi saya lebih suka yang sebelumnya.
Solusi mana yang terbaik? Dan apakah ada cara untuk memasukkan string ke dalam tubuh yang dideklarasikan sebagai string dan bukan objek?
Jawaban
Solusi mana yang terbaik?
Saya suka menggunakan solusi parameter objek.
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
Dari tangkapan layar permintaan Anda, kami dapat melihat, Anda mengirim objek JSON { "key": "value" } ke MyActionmetode Anda . Jadi, Anda tidak boleh mendeklarasikan parameter Anda sebagai string.
Dan apakah ada cara untuk memasukkan string ke dalam tubuh yang dideklarasikan sebagai string dan bukan objek?
Jika Anda berharap untuk menggunakan "string" sebagai parameter input, kirimkan saja konten nilainya.
[HttpPost("/MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
Gunakan JsonObject sebagai parameter input, bukan string dan objek.