2014-06-13 17 views
5

Posso avere un metodo WebAPIPuoi pubblicare un oggetto anonimo come json in un metodo webapi e abbinare le proprietà dell'oggetto json ai parametri della chiamata webapi?

[Route("someroute")] 
public void SomeMethod(string variable1, int variable2, Guid variable3) 
{ 
    //... Code here 
} 

semplice JSON

var jsonvariable = new { 
    variable1:"somestring", 
    variable2:3, 
    variable3: {9E57402D-8EF8-45DE-B981-B8EC201D3D8E} 
} 

Poi fare il palo

HttpClient client = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["SomeURL"]) }; 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
client.PostAsJsonAsync("someroute", jsonvariable).Result 

Venendo da javascript che posso fare qualcosa di simile e risolve le singole proprietà ma non riesco a farlo con una chiamata C#

var postData = { 
    appUniqueId: appUniqueId 
}; 

$http 
    .post('someurl', postData) 
    .success(function(response) { 
     defer.resolve(response.data); 
    }); 

webapi method 
SomeWebMethod(Guid appUniqueId) <-- same name as in postdata 
+0

Per prima cosa, se si suppone che il codice jsonvariabile sia C#, la sintassi è errata. Mostraci il codice esatto che stai cercando di utilizzare e i risultati che ottieni. –

+0

Siamo spiacenti. Ho dimenticato la parola chiave "nuova" su – DRobertE

+0

Sono teorico, questo dovrebbe essere possibile. È probabile che ciò causi un errore per te nell'intestazione mancante o nella richiesta non valida. Suggerirei di attivare Fiddler, inoltrare la richiesta in entrambi i modi e confrontare le richieste non elaborate. Questo dovrebbe aiutarti a iniziare. –

risposta

1

Non si può proprio andare avanti così come ci si sta facendo lì.

Come accennato nei commenti e in this article, è possibile utilizzare solo una parametro FromBody per il metodo. Pertanto, uno o nessuno di questi parametri saranno vincolati dal tuo corpo JSON. Se qualcuno di loro, potrebbe essere il guid che cerca di legare semplicemente a causa dello web api parameter binding rules coinvolto.

Come si aggira questo? Crea una classe in cui vengono descritti i tuoi dati.

public class SomeBodyParameters 
{ 
    public string variable1 { get; set; } 
    public int variable2 { get; set; } 
    public Guid variable3 { get; set; } 
} 

Allora il vostro metodo API sarebbe simile a questa:

[Route("someroute")] 
public void SomeMethod([FromBody]SomeBodyParameters parameters) 
{ 
    //... Code here 
} 

La condizione è che non sarà automagicamente BIND in base al tipo, ma piuttosto il nome che si imposta nel tuo esempio tipo anonimo. variabile1, variabile2 e variabile3 devono avere i loro nomi corrispondenti in entrambi i punti.

Quando ci pensi, quel tipo anonimo che assomiglia a JSON sta davvero passando in una sorta di oggetto, quindi è davvero quello che dovresti accettare in ogni caso.

Cibo per pensare: come saresti in grado di distinguere tra una semplice "stringa" e un oggetto che ha una stringa singolare come var jsonvariable = new { variable1:"somestring"};? Fondamentalmente non potresti e probabilmente i due non dovrebbero essere equivili.

Problemi correlati