2012-09-05 1 views
9

J'essaie d'obtenir RestSharp pour travailler avec un service reposant que j'ai. Tout semble bien fonctionner, sauf quand mon objet est passé par POST contient une liste (dans ce cas particulier une liste de string).RestSharp peut-il envoyer une liste <string> dans une demande POST?

Mon objet:

public class TestObj 
{ 
    public string Name{get;set;} 
    public List<string> Children{get;set;} 
} 

Lorsque cela est envoyé au serveur la propriété Children est envoyé sous forme de chaîne avec le contenu System.Collections.Generic.List`1[System.String].

Voilà comment je vous envoie l'objet:

var client = new RestClient(); 
var request = new RestRequest("http://localhost", Method.PUT); 

var test = new TestObj {Name = "Fred", Children = new List<string> {"Arthur", "Betty"}}; 
request.AddObject(test); 
client.Execute<TestObj>(request); 

Est-ce que je fais quelque chose de mal, ou est-ce un bogue dans RestSharp? (Si cela fait une différence, j'utilise JSON, pas XML.)

Répondre

2

J'ai eu un problème similaire avec une liste de Guids. Mon post fonctionnerait mais la liste n'aurait jamais les données correctes. Je piraté il ABIT et utilisé le json.net pour sérialiser l'objet

Issue I had on another stackoverflow post

Je sais que ce n'est pas parfait, mais le tour est joué

+0

J'utilise des chaînes JSON lorsqu'ils traitent avec IEnumerables dans MVC viewmodels pour ce que ça vaut, donc je ne pense pas que ce soit une mauvaise solution. –

8

Cela dépend de ce serveur que vous frapper, mais si vous touchez un contrôleur API Web ASP.NET (et probablement d'autres technologies côté serveur), cela fonctionnera si vous ajoutez chaque élément de la collection dans une boucle:

foreach (var child in test.Children) 
    request.AddParameter("children", x)); 
+1

Je pense que cela devrait être la meilleure réponse. Il n'y a pas de bonne façon de contourner cela, et je pense personnellement que RestSharp devrait essentiellement l'utiliser par défaut, compte tenu de la prévalence des IEnumerables dans les frameworks web. Comparé à d'autres solutions que j'ai vues sur ce post et sur des posts similaires, cette solution peut facilement être encapsulée et ne dépend d'aucune bibliothèque externe (ce qui introduit probablement une surcharge sur chaque nœud de la collection). –

2

Utilisez AddJsonBody

var client = new RestClient(); 
var request = new RestRequest("http://localhost", Method.PUT); 
request.AddJsonBody(new TestObj { 
    Name = "Fred", 
    Children = new List<string> {"Arthur", "Betty"} 
}); 
client.Execute(request); 

Api Side

[AcceptVerbs("PUT")] 
string Portefeuille(TestObj obj) 
{ 
    return String.Format("Sup' {0}, you have {1} nice children", 
     obj.Name, obj.Children.Count()); 
} 
+0

Merci pour la réponse @ Koranger - sauriez-vous à quoi ressemblerait l'objet dans params - donc il peut être consulté dans le contrôleur de serveur? – BKSpurgeon