Actualmente estoy trabajando en la creación de un back-end impulsado por API utilizando .Net Core con autenticación de Windows. Intentar publicar datos en este backend da como resultado un error 400:
"'noticeNumber=Hello%2C%20world!' is an invalid JSON literal. Expected the literal 'null'. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
Actualmente, la API está configurada para recibir un objeto que contiene datos en un recibo. Una de las propiedades de este objeto es un ID para avisos generados en otras aplicaciones. Esta y todas las demás propiedades son anulables:
// Receipts Controller. [ApiController] [Route("receipts")] public class ReceiptsController : Controller { [HttpPost("post_insertReceipt")] public Task<IActionResult> InsertReceipt(ReceiptForm receipt) { try {/* ... */} catch { /* ... */ } } } //Receipt Form VM public class ReceiptForm { public string? NoticeNumber { get; set; } /*... */ }El Javascript y jQuery utilizados para llamar a la API se ven así:
var data2 = { noticeNumber: "Hello, world!" } $.ajax({ url: "https://localhost:portNumber/receipts/post_insertReceipt", type: "POST", xhrFields: { withCredentials: true }, contentType: "application/json", data: data2, success: function(data) { /* Display success alert */ }, error: function(xhr) { /* display error alert */ } })Según tengo entendido, la sintaxis del objeto de datos es correcta, pero algo claramente no está de acuerdo. Intenté publicar nulos como datos, solo para obtener un error por haber publicado datos.
Entonces, ¿por qué el literal esperado es 'nulo'? ¿Qué determina el literal esperado, por qué y cómo soluciono este problema?
El comentario de @DavidG en la publicación principal revela mi error. Las API se comunican con objetos que se han serializado en cadenas JSON.
Mi experiencia previa con MVC no basado en API me llevó a concluir que simplemente podía pasar el objeto Javascript al campo de datos de $.ajax como se puede hacer; ese no es el caso.
Los datos deben analizarse en una cadena JSON serializada con JSON.Stringify() para que la API los procese correctamente.
$.ajax({ url: "https://localhost:portNumber/receipts/post_insertReceipt", type: "POST", xhrFields: { withCredentials: true }, contentType: "application/json", data: JSON.stringify(data2), success: function(data) { /* Display success alert */ }, error: function(xhr) { /* display error alert */ } })