Ich habe festgestellt, dass bei Verwendung von $ .post () in jquery der Standard-Inhaltstyp application / x-www-form-urlencoded ist - wenn mein asp.net-MVC-Code contentType = application / json haben muss
(In dieser Frage erfahren Sie, warum ich application / json verwenden muss: ASPNET MVC - Warum ist ModelState.IsValid false "Das x-Feld ist erforderlich", wenn dieses Feld einen Wert hat? )
Wie kann ich $ .post () veranlassen, contentType = application / json zu senden? Ich habe bereits eine große Anzahl von $ .post () -Funktionen, daher möchte ich nicht zu $ .ajax () wechseln, da dies zu lange dauern würde
Wenn ich es versuche
$.post(url, data, function(), "json")
ContentType = application / x-www-form-urlencoded ist weiterhin vorhanden. Was genau macht der Parameter "json", wenn er den Inhaltstyp nicht in json ändert?
Wenn ich es versuche
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
Das funktioniert, betrifft aber jedes einzelne $ .get und $ .post, das ich habe, und führt dazu, dass einige kaputt gehen.
Gibt es also eine Möglichkeit, das Verhalten von $ .post () zu ändern, um contentType = application / json zu senden?
quelle
jQuery.post
, es ist eine wirklich einfache Funktion ..."mystring data"
wird sein,application/x-www-form-urlencoded;
wo als Objekt sein{ anyKey: "anyvalue and type" }
wirdapplication/json
. Viele Server, die json lesen, lassen nur ein Objekt oder Array zu, keine Zeichenfolge. Deshalb sagt jquery die Dinge so voraus. Wenn Sie einen Server haben, der Zeichenfolgen, Zahlen usw. liest, ohne in ein Objekt eingeschlossen zu sein, müssen Sie den Inhaltstyp wie in dieser Antwort angeben.Siehe: jQuery.ajax ()
quelle
JSON.stringify(data)
, da der Server eine JSON-Zeichenfolge erwartet und jQuery die Schlüssel-Wert-Paare einfach mit kaufmännischem Und verkettet, formul-urlencodiert.Endlich habe ich die Lösung gefunden, die für mich funktioniert:
quelle
data
Argument zu serialisierenx-www-form-urlencoded
, aber wenn Sie angeben, dass der Anforderungsinhaltstyp JSON ist, besteht es weiterhin darauf,data
in einem nicht übereinstimmenden Format zu senden .Am Ende habe ich jQuery in meinem Skript die folgende Methode hinzugefügt:
Und um es zu benutzen
Dazu wurde einfach der Code "get" und "post" aus den ursprünglichen JQuery-Quellen kopiert und einige Parameter fest codiert, um einen JSON-POST zu erzwingen.
Vielen Dank!
quelle
benutze nur
UPDATED @JK: Wenn Sie in Ihre Frage nur ein Codebeispiel mit $ .post schreiben , finden Sie in der Antwort ein entsprechendes Beispiel. Ich möchte nicht dieselben Informationen wiederholen, die Sie bereits studiert haben, bis Sie wissen: $ .post und $ .get sind Kurzformen von $ .ajax. Verwenden Sie also einfach $ .ajax und Sie können den gesamten Satz seiner Parameter verwenden, ohne globale Einstellungen ändern zu müssen.
Übrigens würde ich nicht empfehlen, den Standard $ .post zu überschreiben. Es ist meine persönliche Meinung , aber für mich ist es wichtig, dass nicht nur das Programm funktioniert, sondern dass alle, die Ihr Programm lesen, es auf die gleiche Weise verstehen. Das Überschreiben von Standardmethoden ohne einen sehr wichtigen Grund kann zu Missverständnissen beim Lesen des Programmcodes führen. Deshalb wiederhole ich meine Empfehlung noch einmal: Verwenden Sie einfach das Original-Formular $ .ajax jQuery anstelle von
jQuery.get
undjQuery.post
und Sie erhalten Programme, die nicht nur perfekt funktionieren, sondern auch von Menschen ohne Missverständnisse gelesen werden können.quelle
Der Datentyp "json", den Sie als letzten Parameter an post () übergeben können, gibt an, welchen Datentyp die Funktion in der Antwort des Servers erwartet und nicht, welchen Typ sie in der Anforderung sendet. Insbesondere wird der Header "Akzeptieren" festgelegt.
Ehrlich gesagt ist es am besten, zu einem Ajax () -Aufruf zu wechseln. Die Funktion post () ist als Annehmlichkeit gedacht. Eine vereinfachte Version des Aufrufs von ajax (), wenn Sie nur ein einfaches Formular veröffentlichen. Das bist du nicht.
Wenn Sie wirklich nicht wechseln möchten, können Sie eine eigene Funktion namens xpost () erstellen und die angegebenen Parameter einfach in Parameter für einen Aufruf von jQuery ajax () umwandeln, wobei der Inhaltstyp festgelegt ist. Auf diese Weise müssen Sie nicht alle diese post () - Funktionen in ajax () - Funktionen umschreiben, sondern nur alle von post in xpost (oder was auch immer) ändern.
quelle
Diese einfache jquery API-Erweiterung (von: https://benjamin-schweizer.de/jquerypostjson.html ) für $ .postJSON () macht den Trick. Sie können postJSON () wie jeden anderen nativen Ajax-Aufruf von jquery verwenden. Sie können Ereignishandler usw. anhängen.
Wie andere Ajax-APIs (wie $ http von AngularJS) setzt es den richtigen contentType auf application / json. Sie können Ihre JSON-Daten (Javascript-Objekte) direkt übergeben, da sie hier stringifiziert werden. Der erwartete zurückgegebene Datentyp ist auf JSON festgelegt. Sie können die Standardereignishandler von jquery für Versprechen anhängen, zum Beispiel:
quelle
Ich weiß, dass dies eine späte Antwort ist. Ich habe tatsächlich eine Verknüpfungsmethode, die ich zum Posten / Lesen in / von MS-basierten Diensten verwende. Sie funktioniert sowohl mit MVC als auch mit ASMX usw.
Verwenden:
HINWEIS: Ich habe auch eine JSON.parseAjax-Methode, die aus der JS-Datei von json.org geändert wurde und die Behandlung für die MS "/Date(...)/" -Daten hinzufügt ...
Die geänderte Datei json2.js ist nicht enthalten, verwendet im Fall von IE8 den skriptbasierten Parser, da es Fälle gibt, in denen der native Parser unterbrochen wird, wenn Sie den Prototyp eines Arrays und / oder Objekts usw. erweitern.
Ich habe überlegt, diesen Code zu überarbeiten, um die Versprechen-Schnittstellen zu implementieren, aber es hat wirklich gut für mich funktioniert.
quelle
Im Mittelpunkt steht die Tatsache, dass JQuery zum Zeitpunkt des Schreibens keine postJSON-Methode hat, während getJSON existiert und das Richtige tut.
Eine postJSON-Methode würde Folgendes tun:
und kann wie folgt verwendet werden:
quelle
Die Dokumentation zeigt derzeit, dass $ .post ab 3.0 das Einstellungsobjekt akzeptiert, was bedeutet, dass Sie die $ .ajax-Optionen verwenden können. 3.0 ist noch nicht veröffentlicht und beim Commit geht es darum, den Verweis darauf in den Dokumenten zu verbergen, aber suchen Sie in Zukunft danach!
quelle
Ich hatte ein ähnliches Problem mit dem folgenden JavaScript-Code:
Wo im Fiddler konnte ich die Anfrage sehen mit:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
Infolgedessen konnte mein Server ein Objekt keinem serverseitigen Typ zuordnen.
Nachdem Sie die letzte Zeile in diese geändert haben:
Im Fiddler konnte ich noch sehen:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
Der Server gab jedoch das zurück, was ich erwartet hatte.
quelle
Wie wäre es mit Ihrem eigenen Adapter / Wrapper?
Und extrem einfache Bedienung:
quelle
Aus irgendeinem Grund funktionierte das Festlegen des Inhaltstyps für die Ajax-Anforderung, wie von @Adrien vorgeschlagen, in meinem Fall nicht. Sie können den Inhaltstyp jedoch mithilfe von $ .post ändern, indem Sie Folgendes tun:
Dann
$.post
rufen Sie an:Ich hatte Probleme mit jQuery + IIS, und dies war die einzige Lösung, die jQuery dabei half, die Verwendung der Windows-1252-Codierung für Ajax-Anforderungen zu verstehen.
quelle
Wir können den Inhaltstyp wie folgt in $ .post ändern
$ .post (URL, Daten, Funktion (Daten, Status, xhr) {xhr.setRequestHeader ("Inhaltstyp", "Anwendung / x-www-Formular-urlencodiert; Zeichensatz = utf-8");});
quelle
$ .post funktioniert nicht, wenn Sie ein CORS-Problem (Cross Origin Resource Sharing) haben. Versuchen Sie, $ .Ajax im folgenden Format zu verwenden: "$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, headers : {'Access-Control-Allow-Origin': '*'}, dataType: 'json', type: 'POST', async: false, success: function (Data) {...}}); "
quelle
Sie können nicht
application/json
direkt senden - es muss ein Parameter einer GET / POST-Anforderung sein.Also so etwas wie
quelle