ASP.NET Core, MVC : Comment obtenir des premières JSON lié à une chaîne sans un type?
Similaire à cette vieille question avant ASP.NET versions, je veux obtenir le corps de la requête HTTP POST à être lié à une chaîne. Il semble que la méthode de lie, mais que value
est nulle, lorsque ASP.NET appelle ma méthode de contrôleur:
namespace Demo.Controllers
{
[Route("[controller]")]
public class WebApiDemoController : Controller
{
...
//POST api/values
[HttpPost]
public System.Net.Http.HttpResponseMessage Post([FromBody]string value)
{
//expected: value = json string, actual: json = null.
}
Dois-je aller chercher le corps à partir d'un flux? Ou devrait-il juste de travail? Lors de l'essai de la méthode ci-dessus, j'ai utilisé les en-têtes http suivant:
Accept: Application/json
Content-Type: Application/json;charset=UTF-8
Je suis de passage dans la suite dans le corps: { "a": 1 }
Je ne veux PAS lier à une variable de chaîne nommée. Je veux lier tout JSON-je, puis-je utiliser le contenu JSON, tout contenu arbitraire à tous, à partir de l'intérieur de ma méthode.
Si j'ai bien compris la documentation, le [FromBody]
attribut doit avoir fait ce que je voulais, mais je devine que l'ASP.NET core, MVC mécanisme de liaison ne se lient pas au format json à une "chaîne de valeur", mais je pourrais peut-être faire autre chose qui m'a un niveau équivalent de flexibilité.
Une question similaire ici me donne l'idée peut-être que je l'aurais écrit [FromBody] dynamic data
au lieu d'utiliser [FromBody] string value
.
Mise à jour: Ce genre de truc doit être pensé avant de le faire, parce que si vous voulez avoir le .net framework poignée JSON et XML codant pour vous, vous juste tué la capacité. Certains types de REPOS serveurs peuvent et souvent ont des exigences à l'appui de XML et JSON des types de contenu, au moins ceux que j'ai rencontrés qui ont des documents de normes.
- Avez-vous vérifié que rien n'est réellement passé dans le corps de la requête? Fiddler?
- Viens de vérifier dans un violon et le contenu du corps est très bien.
- Votre le passage d'un nom/valeur paire
a: 1
de sorte que le paramètre devra êtrestring a
(en supposant que votre attend à recevoir1
- Je ne veux pas d'un modèle concret type de classe, au départ je voulais une chaîne de caractères, mais je pense que peut-être ce que j'ai vraiment besoin de faire est d'utiliser dynamique ici. stackoverflow.com/questions/23135403/...
Vous devez vous connecter pour publier un commentaire.
Les ouvrages suivants, en .net de base 1.x, mais pas dans .net core 2.x.
Comme je l'ai commenté, la solution est d'utiliser
[FromBody]dynamic data
que ma liste de paramètres, à l'aide dedynamic
au lieu destring
, et je vais recevoir unJObject
.Attention: Si votre architecture appels pour un seul WebApi serveur d'être également à l'aise dans la production de XML et JSON, selon le type de contenu d'en-tête d'entrées, ce genre de direct-JSON-consommation de stratégie peut se retourner contre vous. (L'appui de XML et JSON sur le même service est possible avec suffisamment de travail, mais ensuite vous prenez des trucs qui était plus HAUT que le MVC asset pipeline et en le déplaçant vers le bas dans votre contrôleur de méthodes, qui s'avère être à l'encontre de l'esprit de la MVC, où les modèles de venir à vous comme POCOs déjà analysé.)
Une fois que vous convertir une chaîne de caractères à l'intérieur de la méthode, la conversion de l'entrants
JObject
(Newtonsoft.JSON dans la mémoire des données de type JSON) à une chaîne.Trouvé à autre réponse ici.
Exemple de code, grâce à Jeson Martajaya:
Avec dynamique:
Exemple de code avec JObject:
Le plus propre de l'option que j'ai trouvé est l'ajout de votre propre simple InputFormatter:
Et de Démarrage.cs à l'intérieur de ConfigureServices:
Qui vous permettra d'obtenir à la crue de la charge utile JSON dans vos contrôleurs:
Sinon, vous pourriez tout aussi bien accepter un
JObject
et vous serez en mesure d'utiliser Linq to Json ot même directementToString()
si vous avez vraiment besoin de la chaîne.dynamic
résultats dans leJObject
être liéApiController
?L'une des deux méthodes suivantes travaille dans ASP.NET core 2 pour lire les raw chaîne json.
1) celui-ci a une meilleure performance.
2)
Je vois que Sam a déjà été voté pour dire à peu près la même chose, mais dans les tests à l'aide de Facteur, je trouve que si j'ai mis le corps de la requête à un simple double chaîne de caractères entre guillemets ASP lie très bien avec la valeur par défaut " [FromBody]la chaîne de valeur de l'argument.
Pas sûr de savoir si l'application/json est censé accepter les données dans ce format. J'espère que par ce détachement quelqu'un qui connait, va de la pipe et de l'état si c'est valable ou pas.
Vous avez besoin d'un type pour lier les données. Exemple:
pour les données
{ "Name" : "James"}
dynamic value
. Ce n'est pas une chaîne, c'est un dictionnaire JSON, mais c'est très bien.Si vous souhaitez recevoir une chaîne de caractères, vous devez passer comme une chaîne de caractères. Votre
JSON
doivent être entourées de guillemets: