J'ai un type complexe personnalisé avec lequel je souhaite travailler à l'aide de l'API Web.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Et voici ma méthode de contrôleur API Web. Je veux publier cet objet comme ceci:
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;
}
}
Et maintenant, j'aimerais utiliser System.Net.HttpClient
pour faire l'appel à la méthode. Cependant, je ne sais pas quel type d'objet passer dans la PostAsync
méthode et comment le construire. Voici un exemple de code client.
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();
});
Comment créer l' HttpContent
objet de manière à ce que l'API Web le comprenne?
c#
asp.net-web-api
indot_brad
la source
la source
Réponses:
Le générique
HttpRequestMessage<T>
a été supprimé . Ce :sera pas de travail plus .
Au lieu de cela, à partir de cet article , l'équipe ASP.NET a inclus de nouveaux appels pour prendre en charge cette fonctionnalité:
Ainsi, le nouveau code ( de Dunston ) devient:
la source
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
listes KeyValuePair`?PostUrlEncodedAsync
.PostAsJsonAsync
ouPostAsXmlAsync
Vous devriez utiliser la
SendAsync
méthode à la place, c'est une méthode générique, qui sérialise l'entrée du serviceSi vous ne voulez pas créer la classe concrète, vous pouvez la créer avec la
FormUrlEncodedContent
classeRemarque: vous devez faire de votre identifiant un int nullable (
int?
)la source
Notez que si vous utilisez une bibliothèque de classes portable, HttpClient n'aura pas de méthode PostAsJsonAsync . Pour publier un contenu au format JSON à l'aide d'une bibliothèque de classes portable, vous devrez procéder comme suit:
la source
Si vous voulez les types de méthodes de commodité mentionnés dans d'autres réponses mais que vous avez besoin de portabilité (ou même si vous ne le faites pas), vous voudrez peut-être vérifier Flurl [divulgation: je suis l'auteur]. Il enveloppe (finement)
HttpClient
et Json.NET et ajoute du sucre courant et d'autres goodies, y compris des assistants de test intégrés .Publier en JSON:
ou encodé en URL:
Les deux exemples ci-dessus renvoient un
HttpResponseMessage
, mais Flurl inclut des méthodes d'extension pour renvoyer d'autres choses si vous voulez juste aller droit au but:Flurl est disponible sur NuGet:
la source
Après avoir étudié de nombreuses alternatives, je suis tombé sur une autre approche, adaptée à la version API 2.0.
(VB.NET est mon préféré, sooo ...)
Bonne chance! Pour moi, cela a fonctionné (à la fin!).
Cordialement, Peter
la source
Je pense que vous pouvez faire ceci:
la source
Au cas où quelqu'un comme moi ne comprendrait pas vraiment de quoi parlent tout ce qui précède, je donne un exemple simple qui fonctionne pour moi. Si vous avez une API Web dont l'url est " http://somesite.com/verifyAddress ", il s'agit d'une méthode de publication et vous devez lui transmettre un objet d'adresse. Vous souhaitez appeler cette API dans votre code. Voici ce que vous pouvez faire.
la source
C'est le code avec lequel je me suis retrouvé, basé sur les autres réponses ici. Ceci est pour un HttpPost qui reçoit et répond avec des types complexes:
la source
Faites un appel de service comme celui-ci:
Et méthode de service comme celle-ci:
PutAsJsonAsync s'occupe de la sérialisation et de la désérialisation sur le réseau
la source
PostAsJsonAsync
, enverra les données requises, en tant que POST dans JSON.