J'ai remarqué que lors de l'utilisation de $ .post () dans jquery que le contentType par défaut est application / x-www-form-urlencoded - lorsque mon code mvc asp.net doit avoir contentType = application / json
(Voir cette question pour savoir pourquoi je dois utiliser application / json: ASPNET MVC - Pourquoi ModelState.IsValid false "Le champ x est requis" lorsque ce champ a une valeur? )
Comment puis-je faire en sorte que $ .post () envoie contentType = application / json? J'ai déjà un grand nombre de fonctions $ .post (), donc je ne veux pas passer à $ .ajax () car cela prendrait trop de temps
Si j'essaye
$.post(url, data, function(), "json")
Il a toujours contentType = application / x-www-form-urlencoded. Alors, que fait exactement le paramètre "json" s'il ne change pas le type de contenu en json?
Si j'essaye
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
Cela fonctionne mais affecte tous les $ .get et $ .post que j'ai et provoque la rupture de certains.
Existe-t-il un moyen de changer le comportement de $ .post () pour envoyer contentType = application / json?
jQuery.post
méthode, c'est une fonction vraiment simple ..."mystring data"
seraapplication/x-www-form-urlencoded;
où comme un objet{ anyKey: "anyvalue and type" }
seraapplication/json
. De nombreux serveurs qui lisent json n'autorisent qu'un objet ou un tableau, pas une chaîne - c'est pourquoi jquery prédit les choses de cette façon. Si vous avez un serveur qui lit des chaînes, des nombres, etc. sans être encapsulé dans un objet, vous devez spécifier le type de contenu comme dans cette réponse.Voir: jQuery.ajax ()
la source
JSON.stringify(data)
, car le serveur attend une chaîne JSON et jQuery concaténerait simplement les paires clé-valeur en utilisant des esperluettes, form-urlencoded.Enfin, j'ai trouvé la solution qui me convient:
la source
data
argumentx-www-form-urlencoded
, mais si vous indiquez que le type de contenu de la demande est JSON, il insiste toujours sur l'envoidata
dans un format non adapté.J'ai fini par ajouter la méthode suivante à jQuery dans mon script:
Et pour l'utiliser
Cela a été fait en copiant simplement le code "get" et "post" à partir des sources JQuery d'origine et en codant en dur quelques paramètres pour forcer un POST JSON.
Merci!
la source
utiliser juste
MISE À JOUR @JK: Si vous écrivez dans votre question un seul exemple de code avec $ .post, vous trouverez un exemple correspondant dans la réponse. Je ne veux pas répéter les mêmes informations que vous avez déjà étudiées jusqu'à présent: $ .post et $ .get sont des formes abrégées de $ .ajax. Il suffit donc d'utiliser $ .ajax et vous pouvez utiliser l'ensemble complet de ses paramètres sans avoir à modifier les paramètres globaux.
Au fait, je ne recommanderais pas d'écraser le $ .post standard. C'est mon opinion personnelle , mais pour moi, c'est important, non seulement que le programme fonctionne, mais aussi que tous ceux qui lisent votre programme le comprennent de la même manière. L'écrasement des méthodes standard sans avoir une raison très importante peut entraîner un malentendu lors de la lecture du code du programme. Je répète donc ma recommandation une fois de plus: utilisez simplement le formulaire original $ .ajax jQuery au lieu de
jQuery.get
etjQuery.post
et vous recevez des programmes qui fonctionnent non seulement parfaitement, mais peuvent être lus par des personnes sans aucun malentendu.la source
Le type de données "json" que vous pouvez passer comme dernier paramètre à post () indique le type de données que la fonction attend dans la réponse du serveur, pas le type qu'elle envoie dans la demande. Plus précisément, il définit l'en-tête "Accepter".
Honnêtement, votre meilleur pari est de passer à un appel ajax (). La fonction post () est conçue comme une commodité; une version simplifiée de l'appel ajax () pour quand vous faites juste une publication de formulaire simple. Tu ne l'es pas.
Si vous ne voulez vraiment pas changer, vous pouvez créer votre propre fonction appelée, par exemple, xpost (), et la transformer simplement en paramètres pour un appel jQuery ajax (), avec le type de contenu défini. De cette façon, plutôt que de réécrire toutes ces fonctions post () en fonctions ajax (), il vous suffit de les changer de post en xpost (ou autre).
la source
Cette simple extension d'API jquery (à partir de: https://benjamin-schweizer.de/jquerypostjson.html ) pour $ .postJSON () fait l'affaire. Vous pouvez utiliser postJSON () comme tout autre appel Ajax natif jquery. Vous pouvez attacher des gestionnaires d'événements, etc.
Comme d'autres API Ajax (comme $ http d'AngularJS), il définit le bon contentType sur application / json. Vous pouvez transmettre vos données json (objets javascript) directement, car elles sont ici strictes. Le type de données renvoyé attendu est défini sur JSON. Vous pouvez attacher les gestionnaires d'événements par défaut de jquery pour les promesses, par exemple:
la source
Je sais que c'est une réponse tardive, j'ai en fait une méthode de raccourci que j'utilise pour publier / lire vers / depuis les services basés sur MS .. cela fonctionne avec MVC ainsi qu'avec ASMX etc ...
Utilisation:
REMARQUE: J'ai également une méthode JSON.parseAjax qui est modifiée à partir du fichier JS de json.org, qui ajoute la gestion des dates MS "/Date(...)/" ...
Le fichier json2.js modifié n'est pas inclus, il utilise l'analyseur basé sur un script dans le cas d'IE8, car il y a des cas où l'analyseur natif se casse lorsque vous étendez le prototype du tableau et / ou de l'objet, etc.
J'ai envisagé de réorganiser ce code pour implémenter les interfaces promises, mais cela a très bien fonctionné pour moi.
la source
Au cœur du problème se trouve le fait que JQuery au moment de la rédaction n'a pas de méthode postJSON alors que getJSON existe et fait la bonne chose.
une méthode postJSON ferait ce qui suit:
et peut être utilisé comme ceci:
la source
La documentation montre actuellement qu'à partir de la version 3.0, $ .post acceptera l'objet settings, ce qui signifie que vous pouvez utiliser les options $ .ajax. 3.0 n'est pas encore sorti et sur le commit ils parlent de cacher la référence dans les documents, mais cherchez-le à l'avenir!
la source
J'ai eu un problème similaire avec le code JavaScript suivant:
Où dans le violoniste je pouvais voir la demande avec:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
Par conséquent, mon serveur n'a pas pu mapper un objet sur un type côté serveur.
Après avoir changé la dernière ligne en celle-ci:
Dans le Fiddler, je pouvais encore voir:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
Cependant, le serveur a commencé à renvoyer ce que j'attendais.
la source
Que diriez-vous de votre propre adaptateur / wrapper?
Et une utilisation extrêmement simple:
la source
Pour une raison quelconque, la définition du type de contenu sur la demande ajax comme l'a suggéré @Adrien n'a pas fonctionné dans mon cas. Cependant, vous pouvez réellement changer le type de contenu à l'aide de $ .post en procédant comme suit avant:
Faites ensuite votre
$.post
appel:J'ai eu des problèmes avec jQuery + IIS, et c'était la seule solution qui a aidé jQuery à comprendre l'utilisation du codage windows-1252 pour les requêtes ajax.
la source
nous pouvons changer le type de contenu comme ceci dans $ .post
$ .post (url, data, function (data, status, xhr) {xhr.setRequestHeader ("Content-type", "application / x-www-form-urlencoded; charset = utf-8");});
la source
$ .post ne fonctionne pas si vous avez un problème CORS (Cross Origin Resource Sharing). Essayez d'utiliser $ .Ajax au format suivant: "$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, en- têtes: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', type: 'POST', async: false, success: function (Data) {...}}); "
la source
Vous ne pouvez pas envoyer
application/json
directement - cela doit être un paramètre d'une demande GET / POST.Donc quelque chose comme
la source