2012-09-05 15 views
9

Estoy tratando de obtener RestSharp para trabajar con un servicio reparador que tengo. Todo parece funcionar bien, excepto cuando mi objeto pasado a través de POST contiene una lista (en este caso particular, una lista de string).¿Puede RestSharp enviar una lista <string> en una solicitud POST?

Mi objetivo:

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

Cuando esto se envía al servidor la propiedad Children se envía como una cadena con el contenido System.Collections.Generic.List`1[System.String].

Esta es la forma en que estoy enviando el objeto:

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); 

¿Estoy haciendo algo mal, o se trata de un error en RestSharp? (Si hace la diferencia, estoy usando JSON, no XML.)

Respuesta

2

Tuve un problema similar con una lista de Guids. Mi publicación funcionaría pero la lista nunca tendría los datos correctos. Pirateé que un poco y se utiliza la json.net para serializar el objeto

Issue I had on another stackoverflow post

Sé que esto no es perfecto, pero hace el truco

+0

utilizo cadenas JSON cuando se trata de IEnumerables en ViewModels MVC para lo que vale la pena, así que no creo que esto es una mala solución. –

8

Depende de qué servidor que está golpeando, pero si que está golpeando un controlador ASP.NET web API (y probablemente otras tecnologías del lado del servidor), que va a trabajar si se agrega cada elemento de la colección en un bucle:

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

Creo que esta debería ser la mejor respuesta. No hay una forma adecuada de evitar esto, y personalmente creo que RestSharp debería emplear esto de manera predeterminada, teniendo en cuenta la prevalencia de IEnumerables en los marcos web. En comparación con otras soluciones que he visto en esta publicación y en publicaciones similares, esta solución se puede encapsular fácilmente y no se basa en ninguna biblioteca externa (que probablemente introduce cierta sobrecarga en cada nodo de la colección). –

2

uso 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 lateral

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

Gracias por la respuesta @Koranger - ¿Sabría cómo se vería el objeto en params - para que se pueda acceder en el controlador del servidor? – BKSpurgeon

Cuestiones relacionadas