У меня есть настраиваемый сложный тип, с которым я хочу работать с помощью веб-API.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
А вот и мой метод контроллера веб-API. Я хочу опубликовать этот объект так:
public class TestController : ApiController
{
// POST /api/test
public HttpResponseMessage<Widget> Post(Widget widget)
{
widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID
var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
return response;
}
}
И теперь я хотел бы использовать System.Net.HttpClient
для вызова метода. Однако я не уверен, какой тип объекта передать в PostAsync
метод и как его создать. Вот пример кода клиента.
var client = new HttpClient();
HttpContent content = new StringContent("???"); // how do I construct the Widget to post?
client.PostAsync("http://localhost:44268/api/test", content).ContinueWith(
(postTask) =>
{
postTask.Result.EnsureSuccessStatusCode();
});
Как создать HttpContent
объект таким образом, чтобы веб-API его понимал?
c#
asp.net-web-api
indot_brad
источник
источник
Ответы:
Родовое
HttpRequestMessage<T>
был удален . Это :больше не будет работать .
Вместо этого из этого поста команда ASP.NET включила несколько новых вызовов для поддержки этой функции:
Итак, новый код ( от данстона ) становится:
источник
HttpClient.PostAsXXXAsync<T>( T value ) methods are great, but what about one for application/x-www-form-urlencoded format? Is there a simple / short way for that or do we still need to create elaborate
списки KeyValuePair`?PostUrlEncodedAsync
.PostAsJsonAsync
илиPostAsXmlAsync
SendAsync
Вместо этого вы должны использовать метод, это общий метод, который сериализует ввод в службу.Если вы не хотите создавать конкретный класс, вы можете сделать это с помощью
FormUrlEncodedContent
классаПримечание: вам нужно сделать свой идентификатор обнуляемым int (
int?
)источник
Обратите внимание, что если вы используете переносимую библиотеку классов, HttpClient не будет иметь метода PostAsJsonAsync . Чтобы опубликовать контент в формате JSON с помощью переносимой библиотеки классов, вам необходимо сделать следующее:
источник
Если вам нужны типы удобных методов, упомянутые в других ответах, но требуется переносимость (или даже если вы этого не сделаете), вы можете проверить Flurl [раскрытие: я автор]. Он (тонко) обертывает
HttpClient
и Json.NET и добавляет немного текучего сахара и других вкусностей, в том числе некоторых встроенных помощников по тестированию .Опубликовать как JSON:
или в кодировке URL:
Оба приведенных выше примера возвращают
HttpResponseMessage
, но Flurl включает методы расширения для возврата других вещей, если вы просто хотите перейти к делу:Flurl доступен в NuGet:
источник
Изучив множество альтернатив, я нашел другой подход, подходящий для версии API 2.0.
(VB.NET - мой любимый, ооочень ...)
Удачи! Для меня это сработало (в конце концов!).
С уважением, Питер
источник
Думаю, ты справишься:
источник
На случай, если кто-то вроде меня не совсем понял, о чем идет речь, я привожу простой пример, который мне подходит. Если у вас есть веб-API с URL-адресом " http://somesite.com/verifyAddress ", это метод публикации, и вам необходимо передать ему объект адреса. Вы хотите вызвать этот api в своем коде. Вот что можно сделать.
источник
Это код, с которым я закончил, на основе других ответов здесь. Это для HttpPost, который получает и отвечает сложными типами:
источник
Сделайте сервисный звонок следующим образом:
И метод обслуживания вроде этого:
PutAsJsonAsync заботится о сериализации и десериализации по сети
источник
PostAsJsonAsync
будут отправлены требуемые данные в виде POST в JSON.