2012-09-04 4 views
10

J'ai un modèle de vue qui ressemble à.Sérialiser un objet avec restsharp et le transmettre à WebApi ne pas sérialiser la liste

public class StoreItemViewModel 
{ 
    public Guid ItemId { get; set; } 
    public List<Guid> StoreIds { get; set; } 
    [Required] 
    public string Description { get; set; } 
    //[Required] 
    //[DataMember(IsRequired = true)] 
    public int ItemTypeId { get; set; } 


} 

J'ai une petite aide que l'utilisation utilise RestSharp.

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
    { 
     var client = new RestClient(CreateBaseUrl(null)) 
     { 
      Authenticator = new HttpBasicAuthenticator("user", "Password1") 
     }; 

     var request = new RestRequest(apiEndPoint, Method.POST); 
     //request.JsonSerializer = new JsonSerializer(); 
     // {RequestFormat = DataFormat.Json}; 
     request.AddObject(objectToUpdate); 
     // clientJsonSerializer = new YourCustomSerializer(); 
     var response = client.Execute<T>(request); 
     return response; 
    } 

Lors du débogage du contrôleur dans mon api

[HttpPost] 
    public HttpResponseMessage Create([FromBody]StoreItemViewModel myProduct) 
    { 
     //check fields are valid 
    ......... 
    } 

produits myProducts sont tous peuplés en dehors de la liste publique StoreID il retourne toujours une seule récompense avec un Guid vide. Même si j'ai ajouté 2 ou plusieurs StoreIds

Je suppose que c'est parce que je fais quelque chose de mal avec mon aide Créer dans mon application.

Quelqu'un peut-il aider à ce que cela provoque un mal de tête majeur.

Les données brutes envoyées au WebAPI est à la recherche comme

ItemId=f6dbd244-e840-47e1-9d09-53cc64cd87e6&ItemTypeId=6&Description=blabla&StoreIds=d0f36ef4-28be-4d16-a2e8-37030004174a&StoreIds=f6dbd244-e840-47e1-9d09-53cc64cd87e6&StoreId=d0f36ef4-28be-4d16-a2e8-37030004174a 
+0

pourriez-vous partager à quoi ressemble la requête brute json? –

+0

@KiranChalla désolé comment puis-je obtenir cela en utilisant les bits restsharp? –

+0

vous pouvez utiliser Fiddler, qui est un httpproxy, pour capturer les demandes/réponses. –

Répondre

18

J'ai réussi à obtenir ce travail. Je ne pense pas que ce soit la bonne façon mais ça marche.

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
    { 
     var client = new RestClient(CreateBaseUrl(null)) 
     { 
      Authenticator = new HttpBasicAuthenticator("user", "Password1") 
     }; 
     var json = JsonConvert.SerializeObject(objectToUpdate); 
     var request = new RestRequest(apiEndPoint, Method.POST); 
     request.AddParameter("text/json", json, ParameterType.RequestBody); 
     var response = client.Execute<T>(request); 
     return response; 
    } 
+5

Cette solution a fonctionné pour moi. Cependant, j'ai dû utiliser "application/json" plutôt que "text/json". Merci! – carmbrester

+0

Hey, as-tu déjà trouvé un moyen officiel de faire ça? – chobo2

13

J'ai lutté avec le même problème et est venu une solution de travail.

  1. Assurez-vous de définir le format de demande JSON:

    request.RequestFormat = DataFormat.Json;

  2. utilisation ADDBODY, plutôt que AddObject:

    request.AddBody (zNewSessionUsage);

donc votre code serait quelque chose comme ceci:

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
{ 
    var client = new RestClient(CreateBaseUrl(null)) 
    { 
     Authenticator = new HttpBasicAuthenticator("user", "Password1") 
    }; 

    var request = new RestRequest(apiEndPoint, Method.POST); 
    request.RequestFormat = DataFormat.Json; 
    request.AddBody(objectToUpdate); 
    var response = client.Execute<T>(request); 
    return response; 
} 
+1

Et il semble .RequestFormat doit être répertorié avant.AddBody comme dans l'exemple ci-dessus sinon il sera toujours par défaut à la sérialisation XML. – Jafin

19

RestSharp dispose désormais d'un JSON sérialisation façon plus simple d'ajouter un objet à l'Organe RestRequest:

public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new() 
{ 
    var client = new RestClient(CreateBaseUrl(null)) 
    { 
     Authenticator = new HttpBasicAuthenticator("user", "Password1") 
    }; 
    var request = new RestRequest(apiEndPoint, Method.POST); 
    request.AddJsonBody(objectToUpdate); // HERE 
    var response = client.Execute<T>(request); 
    return response; 
} 

Cette a été trouvé dans RestSharp 105.0.1.0

Questions connexes