Mam niestandardowy typ złożony, z którym chcę pracować przy użyciu interfejsu API sieci Web.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
A oto moja metoda kontrolera internetowego interfejsu API. Chcę opublikować ten obiekt w ten sposób:
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;
}
}
A teraz chciałbym użyć System.Net.HttpClient
do wywołania metody. Jednak nie jestem pewien, jaki typ obiektu należy przekazać do PostAsync
metody i jak go skonstruować. Oto przykładowy kod klienta.
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();
});
Jak utworzyć HttpContent
obiekt w taki sposób, aby internetowy interfejs API go zrozumiał?
c#
asp.net-web-api
indot_brad
źródło
źródło
Odpowiedzi:
Generyczny
HttpRequestMessage<T>
został usunięty . To:nie będzie już działać .
Zamiast tego w tym poście zespół ASP.NET zawarł kilka nowych wezwań do obsługi tej funkcji:
Tak więc nowy kod ( z dunston ) staje się:
źródło
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
listy KeyValuePair?PostUrlEncodedAsync
.PostAsJsonAsync
lubPostAsXmlAsync
Zamiast tego należy użyć
SendAsync
metody, jest to metoda ogólna, która serializuje dane wejściowe do usługiJeśli nie chcesz tworzyć konkretnej klasy, możesz to zrobić z
FormUrlEncodedContent
klasąUwaga: musisz ustawić swój identyfikator na wartość null int (
int?
)źródło
Zwróć uwagę, że jeśli używasz przenośnej biblioteki klas, HttpClient nie będzie mieć metody PostAsJsonAsync . Aby opublikować zawartość jako JSON przy użyciu przenośnej biblioteki klas, musisz zrobić to:
źródło
Jeśli szukasz wygodnych metod wymienionych w innych odpowiedziach, ale potrzebujesz przenośności (a nawet jeśli nie), możesz sprawdzić Flurl [ujawnienie: jestem autorem]. To (cienko) owija
HttpClient
i Json.NET i dodaje trochę cukru i innych gadżetów, w tym kilka pomocników testowych .Opublikuj jako JSON:
lub zakodowane w adresie URL:
Oba powyższe przykłady zwracają
HttpResponseMessage
, ale Flurl zawiera metody rozszerzające do zwracania innych rzeczy, jeśli chcesz tylko przejść do sedna:Flurl jest dostępny w NuGet:
źródło
Po zbadaniu wielu alternatyw natknąłem się na inne podejście, odpowiednie dla wersji API 2.0.
(VB.NET jest moim ulubionym, więc ...)
Powodzenia! U mnie to się udało (w końcu!).
Pozdrawiam, Peter
źródło
Myślę, że możesz to zrobić:
źródło
W przypadku, gdy ktoś taki jak ja nie bardzo rozumiał, o czym mówię powyżej, podaję prosty przykład, który działa dla mnie. Jeśli masz interfejs API sieciowy, którego adres URL to „ http://somesite.com/verifyAddress ”, jest to metoda wysyłania wiadomości i wymaga przekazania jej obiektu adresu. Chcesz wywołać ten interfejs API w swoim kodzie. Oto co możesz zrobić.
źródło
To jest kod, z którym się skończyłem, oparty na innych odpowiedziach tutaj. To jest dla HttpPost, który odbiera i odpowiada za pomocą typów złożonych:
źródło
Zadzwoń do serwisu w następujący sposób:
I metoda serwisowa, taka jak ta:
PutAsJsonAsync zajmuje się serializacją i deserializacją w sieci
źródło
PostAsJsonAsync
, wyśle wymagane dane jako POST w formacie JSON.