2013-03-04 14 views
5

Voglio fare un inserimento da un client remoto per quello che ho bisogno di inviare dati via http.
posso usare il getPerformances() correttamente con un httpClientapi/performances?date={0}MVC 4 Web Api Post

voglio chiedere se il mio postPorformances() implemntation dentro il mio PerformancesController è corrrect e se è come chiamare da un cliente?

Qui è la mia realizzazione:

public class PerformancesController : ApiController 
    { 
     // GET api/performances 
     public IEnumerable<Performance> getPerformances(DateTime date) 
     { 
      return DataProvider.Instance.getPerformances(date); 
     } 

     public HttpResponseMessage postPerformances(Performance p) 
     { 
      DataProvider.Instance.insertPerformance(p); 
      var response = Request.CreateResponse<Performance>(HttpStatusCode.Created, p); 
      return response; 
     } 
    } 
public class Performance { 
    public int Id {get;set;} 
    public DateTime Date {get;set;} 
    public decimal Value {get;set;} 
} 

ho provato questo, ma io sono sicuro che nota:

private readonly HttpClient _client; 
    string request = String.Format("api/performances"); 
    var jsonString = "{\"Date\":" + p.Date + ",\"Value\":" + p.Value + "}"; 
    var httpContent = new StringContent(jsonString, Encoding.UTF8, "application/json"); 
    var message = await _client.PutAsync(request, httpContent); 

risposta

10

è possibile utilizzare il HttpClient per chiamare questo metodo:

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://example.com"); 
    var result = client.PostAsync("/api/performances", new 
    { 
     id = 1, 
     date = DateTime.Now, 
     value = 1.5 
    }, new JsonMediaTypeFormatter()).Result; 
    if (result.IsSuccessStatusCode) 
    { 
     Console.writeLine("Performance instance successfully sent to the API"); 
    } 
    else 
    { 
     string content = result.Content.ReadAsStringAsync().Result; 
     Console.WriteLine("oops, an error occurred, here's the raw response: {0}", content); 
    } 
} 

In questo esempio sto utilizzando il metodo generico PostAsync<T> che mi consente di inviare qualsiasi oggetto come secondo parametro e scegliere il formattatore del tipo di supporto. Qui ho usato un oggetto anonimo che imita la stessa struttura del tuo modello Performance sul server e lo JsonMediaTypeFormatter. Ovviamente è possibile condividere questo modello Performance tra il client e il server inserendolo in un progetto di contratti in modo che anche le modifiche sul server vengano automaticamente riflesse sul client.

Nota a margine: la convenzione di denominazione C# impone che i nomi dei metodi inizino con una lettera maiuscola. Quindi getPerformances dovrebbe essere GetPerformances o anche meglio Get e postPerformances dovrebbe essere PostPerformances o anche meglio Post.

+0

Se la chiamata di ap/performance richiede molto tempo, è possibile impostare il client.Timeout prima di effettuare la chiamata – BlackTigerX

Problemi correlati