J'essaie de configurer mon API pour qu'il réponde avec XML ou JSON en fonction de l'en-tête Accept.API ASPNetCore La négociation de contenu ne fonctionne pas
que je suis le tutoriel par Shawn W: https://wildermuth.com/2016/03/16/Content_Negotiation_in_ASP_NET_Core
Il dit d'ajouter un paquet à: "Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final"
Mais je ne pouvais pas trouver si au lieu installé: Microsoft.AspNetCore.Mvc.Formatters.Xml
Il dit d'ajouter cela à la section des services de configuration dans le démarrage:
// Add framework services.
services
.AddMvc(options => {
options.RespectBrowserAcceptHeader = true;
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddJsonOptions(options => {
// Force Camel Case to JSON
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
Puis le navigateur est automatiquement destiné à recevoir du code XML car, par défaut, il utilise l'en-tête Accept: text/xml, je ne reçois pas de code XML dans mon navigateur ou en utilisant postman. Je reçois Json peu importe ce que j'ai défini Accepter l'en-tête.
J'ai essayé de mettre [Produces("application/xml")]
sur mon contrôleur et il renvoie une page vierge de 200 OK.
Comment puis-je obtenir mon API pour retourner JSON par défaut, ou XML si Accepter est présent?
Edit 1:
J'utilise cela comme mon http obtenir le code:
[HttpGet]
public IActionResult Get() {
var invoices = context.Invoices.ToList();
var mappedInvoices = mapper.Map<List<DomainModels.Invoice>, List<Invoice>>(invoices);
return Ok(mappedInvoices);
}
Et je suis en train de retourner ce DTO:
public class Invoice : TrackedObject {
public DateTime Date { get; set; }
public decimal Total { get; set; }
public string OrderNumber { get; set; }
public PaymentType? PaymentType { get; set; }
public ICollection<InvoiceItem> Items { get; set; }
}
public enum PaymentType {
Cheque,
Cash,
Card,
Account
}
Modifier 2:
Si j'échange ce:
// Add framework services.
services
.AddMvc(options => {
options.RespectBrowserAcceptHeader = true;
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddJsonOptions(options => {
// Force Camel Case to JSON
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
et le remplacer par le ci-dessous:
services.AddMvc().AddXmlSerializerFormatters();
Et puis mettre [Produces("application/xml")]
-dessus de ma méthode get je reçois une réponse 406 Non acceptable.
Vous devez ajouter les sérialiseurs XML avec 'services.AddMvc(). AddXmlSerializerFormatters();', c'est un peu plus facile. J'ai eu un problème similaire auparavant, la raison était alors l'objet que je revenais. Pourriez-vous montrer quel type de structure de données vous renvoyez? – juunas
@juunas Échangé mes services.AddMvc entièrement pour le vôtre et il retourne toujours JSON! – Smithy