1

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.

+1

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

+0

@juunas Échangé mes services.AddMvc entièrement pour le vôtre et il retourne toujours JSON! – Smithy

Répondre

4

J'ai finalement trouvé la bonne configuration pour retourner JSON et XML via accepter les en-têtes.

Pour obtenir vos contrôleurs API Web pour revenir JSON ou XML JSON (par défaut), vous avez besoin de votre configuration de services pour ressembler à ceci:

// Add framework services. 
services 
    .AddMvc(options => { 
     options.RespectBrowserAcceptHeader = true; 
    }) 
    //support application/xml 
    .AddXmlDataContractSerializerFormatters() 
    //support application/json 
    .AddJsonOptions(options => { 
     // Force Camel Case to JSON 
     options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    }); 

assez simple quand vous savez comment! Il y a tellement de documentation incorrecte qui traîne à la minute!