Setting processData to false in jQuery breaks my AJAX request

Actually, processData by default assumes that data passed is an object and sends it as application/x-www-form-urlencoded.

Summing up everything said above by @lonesomeday and @vsm to send raw JSON (what is different from the form data) you need to:

$.ajax({
    url: 'http://here-i.am/send-me/an/angel', // Determining far end
    data: JSON.stringify({foo: "bar"}), // Obtaining proper JSON string from data object
    processData: false, // Preventing default data parse behavior
    contentType: "application/json" // Setting proper `ContentType` for our data
    ...
});

You want to pass the data as JSON. You are passing a Javascript object. JSON is a way of serializing Javascript objects to strings so that they can be passed around without compatibility issues.

You actually want to pass the JSON in a string:

$.ajax({
    url: myUrl,
    type: "POST",
    data: '{"foo": "bar"}',
    processData: false,
    contentType: 'application/json'
});

Figure I'd add my current understanding (as of a few hours..)

  • ProcessData = true : convert an object's name value pairs into a URL encoding, or an array's objects into name value pairs, or take a string as a literal.
  • ProcessData = false: take a string as a literal, or call an object's ToString() method.

On top of the ProcessData = true, by setting the 'traditional' flag, it can send it using a recursive encoding that captures complex structures, or a flat name value pair list.

So with respect to the OP, it worked without specifying processData since the default is true. So it converted the name value pairs in the object to a URLEncoded form. When you add the line back in, it calls your object's toString() method. Since you don't have a URL encoded string being returned by a toString() method (you have none), you will get a string such as "[object Object]". Perhaps jQuery cannot send strings that aren't URL encoded, or does not use the inherited toString() method.

The two solutions presented convert the object to a JSON string, and thus there is no processing, and thus processData does nothing. The contentType setting helps the server understand what is being sent.

In addition, one person commented that processing adds the encoded properties to the URL. Not quite: It sends that data via the most appropriate method; GET means appended to the URL, and POST means a urlencoded http body.

Tags:

Ajax

Jquery

Json