2012-06-18 2 views
9

Ich versuche, ein sehr einfaches Beispiel für die Verwendung der Execute-Methode von RestSharp zum Abfragen eines Restendpunkts und Serialisierung zu einem POCO zu verwenden. Alles, was ich versuche, führt jedoch zu einem response.Data-Objekt, das alle Eigenschaften mit einem NULL-Wert hat.RestSharp-Client gibt alle Eigenschaften als Null zurück, wenn JSON-Antwort deserialisiert wird

Hier ist die JSON-Antwort:

{ 
    "Result": 
    { 
     "Location": 
     { 
      "BusinessUnit": "BTA", 
      "BusinessUnitName": "CASINO", 
      "LocationId": "4070", 
      "LocationCode": "ZBTA", 
      "LocationName": "Name of Casino" 
     } 
    } 
} 

Hier ist mein Testcode

[TestMethod] 
    public void TestLocationsGetById() 
    { 
     //given 
     var request = new RestRequest(); 
     request.Resource = serviceEndpoint + "/{singleItemTestId}"; 
     request.Method = Method.GET; 
     request.AddHeader("accept", Configuration.JSONContentType); 
     request.RootElement = "Location"; 
     request.AddParameter("singleItemTestId", singleItemTestId, ParameterType.UrlSegment); 
     request.RequestFormat = DataFormat.Json; 

     //when 
     Location location = api.Execute<Location>(request);    

     //then 
     Assert.IsNotNull(location.LocationId); //fails - all properties are returned null 

    } 

Und hier meine API-Code

public T Execute<T>(RestRequest request) where T : new() 
    { 
     var client = new RestClient(); 
     client.BaseUrl = Configuration.ESBRestBaseURL; 

     //request.OnBeforeDeserialization = resp => { resp.ContentLength = 761; }; 

     var response = client.Execute<T>(request); 
     return response.Data; 
    } 

Und schließlich, hier ist meine POCO

public class Location 
{   
    public string BusinessUnit { get; set; } 
    public string BusinessUnitName { get; set; } 
    public string LocationId { get; set; } 
    public string LocationCode { get; set; } 
    public string LocationName { get; set; } 
} 

Darüber hinaus sind die Eigenschaften ErrorException und ErrorResponse für die Antwort NULL.

Dies scheint wie ein sehr einfacher Fall, aber ich bin den ganzen Tag in Kreisen herumgelaufen! Vielen Dank.

+0

Was passiert, wenn Sie 'request.AddUrlSegement (" singleItemTestId ", singleItemTestId)' anstelle des Aufrufs aufrufen, den Sie 'AddParameter' hinzufügen müssen? –

Antwort

8

Was ist die Content-Type in der Antwort? Wenn kein standardmäßiger Inhaltstyp wie "application/json" usw. vorhanden ist, wird RestSharp nicht verstehen, welchen Deserializer zu verwenden ist. Wenn es in der Tat ist ein Content-Typ nicht „verstanden“ von RestSharp (Sie durch Überprüfen der Accept geschickt in der Anforderung überprüfen können), dann können Sie dieses Problem lösen, indem Sie:

client.AddHandler("my_custom_type", new JsonDeserializer()); 

EDIT:

Ok, sorry, im JSON suchen wieder, müssen Sie so etwas wie:

public class LocationResponse 
    public LocationResult Result { get; set; } 
} 

public class LocationResult { 
    public Location Location { get; set; } 
} 

Und dann tun:

client.Execute<LocationResponse>(request); 
+0

Der Inhaltstyp ist "application/json". Sollte diese Zeile nicht: request.RootElement = "Location"; Entfernen Sie die Notwendigkeit für den "LocationResponse" -Objektwrapper, den Sie vorgeschlagen haben? – smercer

+0

Hmmm, nachdem ich versucht habe, was dein zweiter Schnitt empfohlen hat, hat es funktioniert, aber ich bin mir nicht sicher, warum ich das verstehe, außer wenn ich den Zweck der RootElement-Eigenschaft völlig falsch verstehe. Gut, danke! – smercer

+3

Die 'RootElement'-Unterstützung in JsonDeserializer scheint nur die Angabe einer Eigenschaft auf dem Toplevel-Objekt als Element zu unterstützen, z. "Ergebnis" in Ihrem JSON. Es wird nicht tiefer in die Objekthierarchie gesucht: https://github.com/restsharp/RestSharp/blob/master/RestSharp/Deserializers/JsonDeserializer.cs – Pete

Verwandte Themen