$.post() sendet Daten nicht als json, sondern als x-www-form-urlencoded

Lesezeit: 2 Minuten

Benutzer-Avatar
byte_slave

Dieser ist wirklich seltsam. Ich habe mehrere $.post() im Code, aber man weiß nicht, warum die JSON-Parameter als gesendet werden x-www-form-urlencoded stattdessen und funktioniert daher nicht.

Hier ist der Code:

$.post("/Route/SaveTransportProperties", { properties: JSON.stringify(propArray), currTravelBox: JSON.stringify(travelBoxObj), accessToken: getAccessToken()}, function(data)
    {
        //DO STUFF
    });

Das XHR sieht in Firefox so aus:
Firefox-Screenshot

Irgendwelche Ideen, warum das passiert? Ich habe auch den Typ als ‚json‘ erzwungen, funktioniert aber auch nicht.

Benutzer-Avatar
James Kyburz

Wenn Sie die Daten als json senden möchten, verwenden Sie die $.ajax-Funktion

Sie können Typ post und dataType json angeben.

$.ajax({
  url: "mydomain.com/url",
  type: "POST",
  dataType: "xml/html/script/json", // expected format for response
  contentType: "application/json", // send as JSON
  data: $.param( $("Element or Expression") ),

  complete: function() {
    //called when complete
  },

  success: function() {
    //called when successful
 },

  error: function() {
    //called when there is an error
  },
});

Entnommen aus der Ajax-Dokumentation

http://api.jquery.com/jQuery.ajax/

contentTypeString
Default: 'application/x-www-form-urlencoded; charset=UTF-8'

  • OK. Ich habe den Ajax-Code möglicherweise von irgendwoher oder vielleicht von einer alten oder neueren Jquery-Version falsch kopiert, aber das Problem, warum Ajax als nicht funktionierend (siehe meinen Kommentar unter Olli-Antwort) bc im Typparameter war, hatte ich “JSON” anstelle von “POST”.

    – byte_slave

    3. April 2011 um 13:42 Uhr

  • dataType gibt den erwarteten Typ der an Antwort, nicht die Postdaten. Die Antwort von Olli ist richtig – Sie müssen $.ajax verwenden und die Option contentType angeben.

    – Chris Leishmann

    6. September 2012 um 18:16 Uhr

  • $.param(obj) könnte durch JSON.stringify(obj) ersetzt werden, das eine bessere Leistung erbringt. Benchmark siehe hier: jsperf.com/jquery-param-and-json-stringify

    – RonyK

    19. Mai 2015 um 13:36 Uhr

Da $.post() dient zum Senden von formularähnlichen Anfragen. $.ajax ist für das Senden, was Sie wollen. Sehen contentType in $.ajax Seite für weitere Informationen.

Zitieren:

Verwenden Sie diesen Inhaltstyp, wenn Sie Daten an den Server senden. Standard ist “application/x-www-form-urlencoded”, was für die meisten Fälle in Ordnung ist. Wenn Sie explizit einen Inhaltstyp an $.ajax() übergeben, wird dieser immer an den Server gesendet (auch wenn keine Daten gesendet werden). Daten werden immer mit UTF-8-Zeichensatz an den Server übertragen; Sie müssen dies serverseitig entsprechend entschlüsseln.

  • Post ist eine Abkürzung für $.ajax(), also sollte es funktionieren und ich habe es auch an einer anderen Stelle in meinem Code funktioniert …. genau hier scheint es zu scheitern. Der Grund, warum ich $.ajax() nicht verwende, liegt daran, dass im IE9-Kompatibilitätsmodus eine Ausnahme “SCRIPT87: Ungültiges Argument” ausgelöst wird. aber mit $.post() (abgesehen davon, dass es nicht funktioniert … das schüchtert meine Frage) wirft keinen Fehler.

    – byte_slave

    3. April 2011 um 13:37 Uhr

das funktioniert auch bei mir

$.ajax({
  url: "mydomain.com/url",
  type: "POST",
  dataType: "xml/html/script/json", // expected format for response
  contentType: "application/json", // send as JSON
  data: JSON.stringify(data),

  complete: function() {
    //called when complete
  },

  success: function() {
    //called when successful
 },

  error: function() {
    //called when there is an error
  },
});

Sie können Ihre Daten auch in der Erfolgsfunktion als json erzwingen:
data = JSON.parse(data);

1245410cookie-check$.post() sendet Daten nicht als json, sondern als x-www-form-urlencoded

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy