web-dev-qa-db-fra.com

API Web pour renvoyer du XML

Je souhaite que ma méthode API WEB renvoie un objet XML à l'application appelante. Actuellement, il ne fait que renvoyer le XML en tant qu'objet chaîne. Est-ce un non non? Si tel est le cas, comment pouvez-vous indiquer à la méthode webapi get qu'elle renvoie un objet de type XML?

Merci

Edit: un exemple de la méthode Get:

[AcceptVerbs("GET")]
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName)
{
   List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData
            ("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
   string AllResults = "";
   for (int i = 0; i < SQLResult.Count - 1; i++)
   {
       AllResults += SQLResult[i];
   }
    string sSyncData = "<?xml version=\"1.0\"?> " + AllResults;
    HttpResponseMessage response = new HttpResponseMessage();
    response.Content = new StringContent(sSyncData);
    return response;          
}

C'est un peu hacky parce que je suis encore au stade du prototypage. Est-ce que je vais refacturer quand je peux prouver que c'est faisable.

41
Matt

Si vous renvoyez un objet sérialisable, WebAPI enverra automatiquement du code JSON ou XML en fonction de l'en-tête Accept envoyé par votre client.

Si vous retournez une chaîne, vous obtiendrez une chaîne.

37
Adam Baxter

Si vous ne voulez pas que le contrôleur décide du type d'objet de retour, vous devez définir le type de retour de votre méthode sur System.Net.Http.HttpResponseMessage et utilisez le code ci-dessous pour renvoyer le code XML.

public HttpResponseMessage Authenticate()
{
  //process the request 
  .........

  string XML="<note><body>Message content</body></note>";
  return new HttpResponseMessage() 
  { 
    Content = new StringContent(XML, Encoding.UTF8, "application/xml") 
  };
}

C'est le moyen le plus rapide de toujours renvoyer du XML à partir d'une API Web.

82
Arkadas Kilic

Voici un autre moyen d'être compatible avec un type de retour IHttpActionResult. Dans ce cas, je lui demande d'utiliser le sérialiseur XML (optionnel) au lieu du sérialiseur Data Contract, j'utilise return ResponseMessage( pour que je reçoive un retour compatible avec IHttpActionResult:

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new ObjectContent<SomeType>(objectToSerialize, 
              new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
                  UseXmlSerializer = true 
              })
       });
21
AaronLS

Vous devriez simplement renvoyer votre objet sans vous préoccuper de savoir s'il s'agit de XML ou de JSON. Il incombe au client de demander du JSON ou du XML à l’API Web. Par exemple, si vous passez un appel avec Internet Explorer, le format par défaut demandé sera Json et l’API Web renverra Json. Mais si vous faites la demande via Google Chrome, le format de demande par défaut est XML et vous récupérerez XML.

Si vous faites une demande en utilisant Fiddler , vous pouvez spécifier l'en-tête Accept comme étant Json ou XML.

Accept: application/xml

Vous voudrez peut-être voir cet article: Négociation de contenu dans la version bêta de l’API Web MVC4 ASP.NET - Partie 1

EDIT: basé sur votre question modifiée avec le code:

Retour simple liste de chaîne, au lieu de la convertir en XML. essayez-le avec Fiddler.

public List<string> Get(int tenantID, string dataType, string ActionName)
    {
       List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList();
       return SQLResult;
     }

Par exemple, si votre liste est comme:

List<string> list = new List<string>();
list.Add("Test1");
list.Add("Test2");
list.Add("Test3");
return list;

et vous spécifiez Accept: application/xml le résultat sera:

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.Microsoft.com/2003/10/Serialization/Arrays">
  <string>Test1</string>
  <string>Test2</string>
  <string>Test3</string>
</ArrayOfstring>

et si vous spécifiez 'Accepter: application/json' dans la demande, la sortie sera:

[
  "Test1",
  "Test2",
  "Test3"
]

Laissez donc le client demander le type de contenu au lieu d’envoyer le XML personnalisé.

17
Habib