visual tutorial studio net example ejemplo crear asp apicontroller c# asp.net asp.net-web-api routes schema

c# - tutorial - Esquema de datos de ruta de ASP.NET WebAPI



web api rest c# (3)

Estás en camino.

No necesita preocuparse demasiado por la implementación interna de Newtonsoft.Json. En particular, debería intentar evitar el uso de JObject / JToken / otros tipos de J, y definitivamente no necesita subclasificar JObject.

Su clase de objeto de solicitud puede ser simplemente:

public class UploadRequest { [JSONProperty("pdfs")] public SomePDFClass PDFs[] { get; set; } }

Esto correspondería a una solicitud de:

{ "pdfs": [ { <some PDF object here> }, { <some PDF object here> }, { <some PDF object here> } ] }

El parámetro de cadena de JSONPropertyAttribute define el nombre de la propiedad tal como aparece en el documento JSON, por lo que no es necesario que tenga el mismo nombre en el código que en JSON. Puede cambiar el nombre en código, siempre que el atributo siga usando el mismo nombre que el documento.

Actualmente, estamos usando una ruta como esta:

[HttpPost] [Route("upload")] public async Task<dynamic> Upload(dynamic uploadedData) { JArray files = uploadedData.pdfs; // ... }

En lugar de utilizar la dynamic , me gustaría tener un entendimiento esquemático de los datos que entran. Así que podría usar una configuración como esta, con una clase que defina el esquema:

public class UploadRequest : JObject { public JArray pdfs { get; set; } } [HttpPost] [Route("upload")] public async Task<dynamic> Upload(UploadRequest uploadedData) { // Now can access the JArray via uploadedData.pdfs directly // ... }

¿Es este el enfoque correcto para esta situación? ¿O hay alguna otra práctica recomendada estándar para recibir datos JSON a través de ASP .NET WebAPI?

Específicamente, este enfoque no funciona actualmente. Aunque mi pequeña clase de esquema extiende JObject, me sale un error de

El diccionario de parámetros contiene una entrada no válida para el parámetro ''uploadedData'' para el método ''System.Threading.Tasks.Task`1 [System.Object] Upload (UploadRequest)'' en ''EditPdfServer.Controllers.PdfFileController''. El diccionario contiene un valor de tipo ''Newtonsoft.Json.Linq.JObject'', pero el parámetro requiere un valor de tipo ''EditPdfServer.Controllers.PdfFileController + UploadRequest''.

Entonces, en primer lugar, ¿esto parece un enfoque adecuado? En segundo lugar, ¿hay uno mejor? En tercer lugar, ¿por qué no funciona este enfoque? Gracias por adelantado.


Como su método usa el verbo post, debe agregar el atributo [FromBody] en su parámetro de método:

[HttpPost] public async Task<dynamic> Upload([FromBody] UploadRequest UploadedData) { // Now can access the JArray via uploadedData.pdfs directly // ... }


Sugeriría usar el atributo JSONproperty para su propiedad pdfs:

public class UploadRequest : JObject { [JSONProperty("<name of the property in the JSON object>")] public JArray pdfs { get; set; } }

También eche un vistazo a esta publicación para obtener más información sobre el atributo: JSON.NET deserialize / serialize JsonProperty JsonObject