2016-05-27 6 views
1

Ich habe komplexes Objekt für Get WebAPI von uri zu holen,bessere Art und Weise Modell Pass WebAPI von MVC

Bei WebAPI,

Public IHttpActionresult GetData([FromUri]ComplexModel model) 
{ 
    //some code 
} 

public class ComplexModel 
{ 
    public int Id {get; set;} 
    public string name {get; set;} 
} 

Bei MVC,

Public void CallWebApi() 
{ 
    using(HttpClient client = new HttpClient()) 
    { 
     var uri = baseApi + "Contoller/GetData?Id=1&name=testname"; 
     var response = client.GetAsync(uri).Result; 
    } 
} 

Statt des Führens komplexes Objekt durch Abfragezeichenfolge, gibt es einen besseren Ansatz?

Antwort

0

Wenn Sie HTTP GET Methode verwenden müssen, dann haben Sie keine Alternativen (abgesehen davon, diese Parameter in einige HTTP-Header, die, glaube ich, ist keine gute Alternative).

Um die Erstellung Ihres Endpunkt-URI zu vereinfachen, können Sie eine statische Methode erstellen, die Ihr Objekt in eine Abfragezeichenfolge serialisiert.

So etwas sollte funktionieren (taken from this answer):

public string GetQueryString(object obj) { 
    var properties = from p in obj.GetType().GetProperties() 
         where p.GetValue(obj, null) != null 
         select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString()); 

    return String.Join("&", properties.ToArray()); 
} 

Und auf diese Weise verwenden:

ComplexModel myModel = GetMyModel(); 
using(HttpClient client = new HttpClient()) 
{ 
    var uri = baseApi + "Contoller/GetData?" + GetQueryString(myModel); 
    var response = await client.GetAsync(uri); 
} 

Als Nebenwirkung: Bitte denken Sie daran, nie asynchrone Methoden aufrufen und dann warten auf ihre Ergebnis in einer synchronen Weise, this could lead to deadlocks.

+0

Es ist gut, aber immer noch Modellwerte werden in Querystring übergeben, ich suche nach alternativen Ansatz anstelle von Querystring. – user472269

+1

Ich nahm an, dass Ihre Web-API-Methode "GET" war. Mit 'GET' haben Sie keine anderen Optionen: Sie können keinen Body für eine 'GET' Anfrage senden. Wenn Sie Alternativen wollen, müssen Sie Ihre Methode in 'POST' oder' PUT' umwandeln. –

Verwandte Themen