2013-03-04 4 views
5

Я хочу сделать вставку из удаленного клиента, потому что мне нужно отправить данные через http.
я могу использовать getPerformances() правильно с httpClientapi/performances?date={0}MVC 4 Web Api Post

Я хочу спросить, если мой postPorformances() implemntation внутри моей PerformancesController является corrrect, и если это то, как назвать это от клиента?

Вот моя реализация:

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

Я попытался это одно, но я к сведению, что:

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>, позволяющий мне отправить какой-либо объект в качестве второго параметра и выбрать форматтер типа носителя. Здесь я использовал анонимный объект, имитирующий ту же структуру, что и ваша модель Performance на сервере, и JsonMediaTypeFormatter. Разумеется, вы можете поделиться этой моделью Performance между клиентом и сервером, разместив ее в проекте контрактов, чтобы изменения на сервере также автоматически отражались на клиенте.

Боковое замечание: Соглашение об именовании C# диктует, что имена методов должны начинаться с заглавной буквы. Таким образом, getPerformances должно быть GetPerformances или даже лучше Get и postPerformances должно быть PostPerformances или даже лучше Post.

+0

Если вызов ap/performances занимает много времени, возможно, вы захотите установить client.Timeout перед выполнением вызова – BlackTigerX

Смежные вопросы