comment faire pour enregistrer un objet à l'aide .net webapi
J'ai créer WebAPI .net (mon premier). L'utilisation de cette api pour obtenir un objet de db, requête db etc est facile pour moi. Rien de nouveau
Mais je me demandais comment faire pour enregistrer un objet à l'aide de cette webapi ?
J'ai un clinet application (tablette, téléphone, PC) qui communique avec mon webapi. À partir de mon application, il ya une possibilité d'enregistrer un utilisateur de nouvelles. Maintenant, j'ai besoin de l'enregistrer dans la bd. J'utilise Azure SQL. Maintenant, comment puis-je passer cet objet à l'API afin que je puisse l'enregistrer ?
Pour mon application j'utilise C#/XAML
Pour ma WebAPI que j'utilise .NET
Je suis tring avec ce code:
HttpClient httpClient = new HttpClient();
String u = this.apiUrl + "sd/Localization/insert";
Uri uri = new Uri(u);
HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
Mais je ne sais pas comment envoyer de l'objet ? Dois-je le sérialiser ? Si oui comment faire pour l'envoyer par la poste.
//Mise à JOUR
J'ai construit ce
HttpClient httpClient = new HttpClient();
String u = this.apiUrl + "sd/Localization/insert";
Uri uri = new Uri(u);
HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
httpRequestMessage.Content = new StringContent("{'Name':'Foo', 'Surname':'Bar'}");
await httpClient.PostAsync(uri, httpRequestMessage.Content);
Mais dans mon API de la variable est null
C'est le code de mon api
//POST sd/Localization/insert
public void Post(string test)
{
Console.WriteLine(test);
}
Le "test" de la variable est null.
Ce que je fais mal ?
//Mise à JOUR 2
using (HttpClient httpClient = new HttpClient())
{
String u = this.apiUrl + "sd/Localization/insert";
Uri uri = new Uri(u);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri)
{
Method = HttpMethod.Post,
Content = new StringContent("my own test string")
};
await httpClient.PostAsync(uri, request.Content);
}
La configuration de routage
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "sd/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
après toutes vos réponses, j'ai créé ce mais encore obtenir la valeur null en paramètre dans mon api. Où est l'erreur ?
OriginalL'auteur Fixus | 2012-07-27
Vous devez vous connecter pour publier un commentaire.
WebAPI est vraiment bon à l'analyse des données envoyés et de le convertir en .NET des objets.
Je ne suis pas habitué à l'aide d'un client C# avec WebAPI, mais je voudrais essayer le suivant:
Remarque: Vous devez utiliser
System.Net.Http
(à partir de l'assemblée avec le même nom) ainsi queSystem.Net.Http.Formatting
(également à partir de l'assemblée avec le même nom) pour cela.Fixus, Êtes-vous à l'aide de la version RC de ASP.NET MVC 4 ou une version plus ancienne de l'API Web ?
Je
m using VS RC 2012 and I
ve projet créé avec .Net Framework 4.5Assurez-vous que vous avez ajouté des références pour les deux assemblées, que j'ai mentionnées - ainsi que
using
clauses. Mais vous pouvez utiliser PostAsync tout aussi bien, c'est juste un peu plus détaillé:client.PostAsync("uri", yourobject, new JsonMediaTypeFormatter());
J'ai remarqué qu'il est étiqueté à son poste avec windows 8 et windows runtime, ce qui implique qu'il est écrit "Windows Store" (anciennement "Métro") app, bien qu'il n'est pas fait explicitement clair. Si c'est le cas, cela pourrait expliquer pourquoi il n'a pas ces méthodes, aussi loin que je peux dire, la version WinRT .NET 4.5 ne comprend pas le
HttpClientExtensions
classe (généralement dansSystem.Net.Http.Formatting.dll
) qui définitPostAsJsonAsync
(et VS ne vous permettront pas d'ajouter une référence à des bibliothèques de la principale .NET bibliothèque de classe).OriginalL'auteur Anders Arpi
La
HttpRequestMessage
classe possède une propriété nomméeContent
qui est le type deHttpContent
(une classe abstraite). Vous pouvez définir le corps de la requête. Par exemple, vous pouvez définir le contenu JSON là et puis de l'envoyer à l'API:Vous pouvez également utiliser la fonction de formatage et de fournir votre objet CLR pour
ObjectContent
et délégué de la sérialisation pour le Formateur.Il y a beaucoup d'échantillons sur HttpClient et API Web ici: http://blogs.msdn.com/b/henrikn/archive/2012/07/20/asp-net-web-api-sample-on-codeplex.aspx
essayez d'utiliser
FromBody
attribut:public void Post([FromBody]string test)
.quand j'ajoute ceci, la méthode n'est pas appelée. je veux dire par la méthode Post dans mon API. Quand je supprime elle est invoquée, mais le test de la variable est null
OriginalL'auteur tugberk
En supposant que vous avez une méthode d'action sur votre site web API contrôleur qui prend en charge une opération POST qui est similaire:
Vous pouvez utiliser le HttpClient pour sérialiser votre objet en JSON et publier le contenu pour vous la méthode du contrôleur:
API framework) est disponible à http://nuget.org/packages/AspNetMvc.
http://msdn.microsoft.com/en-us/library/hh849329(v=vs. 108).aspx.
Je vous recommande aussi de prendre un coup d'oeil à Création d'une API Web qui prend en charge les Opérations CRUD, qui couvre les scénarios que vous décrivez, précisément le la Création d'une Ressource section.
ve updated my post. Could you look on it ? I think I
m près 🙂Pouvez-vous me montrer votre configuration de routage?
J'ai mis à jour mon post et ajouté de la configuration du routage. Des conseils à donner ? 🙂
Après la lecture de votre commentaire, j'ai vérifié le routage. J'ai changé le paramètre du nom de la fonction dans webapi de "test" à la "id". Maintenant, dans mon api de la variable est la valeur "insérer" où l'url de ce post action / POSTE/ sd/Localisation/insertion public void Post(String id). Je ne comprends toujours pas la valeur que je veux, mais au moins ce n'est pas null. Les idées de ce que je fais mal ?
Utiliser le PostAsJsonAsync méthode au lieu de construire le contenu explicitement dans la demande messag, et d'ajouter votre type complexe à la méthode de contrôleur comme un parmater. Le modèle de liaison n'est pas de traduire le contenu de demande pour un type complexe (ce que vous avez définis dans votre JSON). Vous devez définir un "Utilisateur" de la classe avec les propriétés que vous souhaitez envoyer et de l'utiliser comme paramètre dans votre méthode de contrôleur afin d'avoir le modèle de liaison de convertir la charge utile JSON en objet désérialisé représentation.
OriginalL'auteur Oppositional
Je pense que j'ai trouvé la solution c'est pourquoi je poste cette réponse pas de commentaire afin que toute discussion ultérieure pourrait être regroupés.
Si j'envoie la requête comme ceci
Que je peux le faire dans mon webapi de
De l'OMI, ce n'est pas la solution parfaite mais au moins je suis sur de trace. Je vois que les paramètres de la fonction definitione je peux l'obtenir que si elles sont dans l'URL, même quand j'envoie une requête POST.
Probablement cette solution de travail (je n'ai pas regardé encore) quand j'utilise des objets plus complexes, puis de la Chaîne.
Toutes les pensées de quelqu'un. Pensez-vous que c'est la bonne solution ?
Je n'ai pas PostAsJsonAsync où je peux le type de jeu. J'ai PostAsync où je peux mettre uniquement les message comme une classe de HttpContent
Cela pourrait être vraiment la fin de votre question, mais je l'ai trouvé aujourd'hui et a lutté pour quelques heures. La raison pour laquelle vous ne pouvait pas publier un objet à votre webapi était parce que votre Modèle n'a pas de Constructeur par défaut (dans le site web de l'api de côté) une fois que vous ajoutez un vide de constructeur par défaut, il fonctionne. Je vais poster une réponse pour la postérité
OriginalL'auteur Fixus
Je ne suis pas familier avec le HttpClient (je crois que c'est .NET 4.5), mais les concepts derrière WebAPI sont en utilisant la norme Reposant constructions. Si vous souhaitez insérer un objet via WebAPI, vous aurez besoin d'envoyer une requête POST vers le service. Vous devriez mettre le contenu de l'objet dans le CORPS de la demande.
OriginalL'auteur Paolo del Mundo
Ajouter vide constructeurs à votre webapi modèle de personnes. Cela vous permettra d'économiser tout le temps je viens de perdre à essayer de comprendre pourquoi mon objet est null.
La sérialisation (et dé-sérialisation je suppose) besoin constructeurs par défaut.
OriginalL'auteur irco
C'est ma voie.c'est avec succès.j'espère que c'est utile
D'abord:est tous de la bibliothèque, vous devez avoir.vous pouvez télécharger à partir de nuget
à l'aide de Newtonsoft.Json; et
à l'aide de Newtonsoft.Json.Linq;
Client :
Côté serveur:
Tout fait !
OriginalL'auteur Hoàng Quân Gster
J'espère que cela allait être ce que vous cherchez.
J'ai créé un Poste générique qui va accepter de tout objet et de le poster
Côté Client
l'appel, ce sera aussi simple que de
Aussi, vous pouvez lire l'objet après la poste en utilisant ReadAsStringAsync() si votre cas d'utilisation.
Côté Serveur
OriginalL'auteur Tamer