2013-03-04 9 views
5

私は離れたクライアントからhttpを介してデータを送信する必要があることを挿入したいと思います。
私はPerformancesController内部の私のpostPorformances() implemntationがcorrrectであれば、それはクライアントからそれを呼び出す方法であればお願いしたいと思いますhttpClientapi/performances?date={0}MVC 4 Web Api Post

で正しくgetPerformances()を使用することができますか?ここで

は私の実装です:

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;} 
} 

私はこの1つを試してみましたが、私は確信してノートだ:

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); 

答えて

10

あなたはこれを呼び出すためにHttpClientを使用することができます方法:

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); 
    } 
} 

この例では、PostAsync<T>という一般的な方法を使用しています。この方法では、オブジェクトを2番目のパラメータとして送信し、メディアタイプフォーマッタを選択できます。ここでは、サーバー上のPerformanceモデルとJsonMediaTypeFormatterモデルと同じ構造を模倣した匿名オブジェクトを使用しました。もちろん、クライアントとサーバーの間でこのPerformanceモデルをコントラクトプロジェクトに配置することでこのモデルを共有することができるため、サーバー上の変更も自動的にクライアントに反映されます。

サイドリマーク:C#命名規則では、メソッド名は大文字で始まることが示されています。だからgetPerformancesGetPerformances、さらにはGetとなり、postPerformancesPostPerformances、さらにはPostとなるはずです。

+0

ap/performances呼び出しに時間がかかる場合は、呼び出しを行う前にclient.Timeoutを設定するとよいでしょう。 – BlackTigerX

関連する問題