0

I try to send jQuery AJAX request to my flask server :

$.ajax({
            type: 'GET',
            url: '/get',
            dataType: "json",
            contentType:"application/json",
            data: JSON.stringify({ subject : "gpu",
                    filter : {
                        ids: [2, 3]
                        }
                    }),
            success: function (data) {
                console.debug(data);
            }
        });

And then I wait for a response from the server. Server part looks like this:

@api.route('/get', methods=['GET'])
def get():
    response = None
    try:
        data = request.get_json()
        response = do_some_magic(data)
    except Exception as e:
        respond = {'state': 'error', 'data': e.message}
    finally:
        return json.dumps(respond)

So, this combination doesn't work. request has only args field = ImmutableMultiDict([('{"subject":"gpu","filter":{"ids":[2,3]}}', u'')]) and json field = None.

But when in ajax request I set type: 'GET' and in flask get method methods=['GET'], server starts to handle requests correctly.

So, it would not be a real issue, but then I tried to send a GET request with postman utility. It's request:

GET /get HTTP/1.1
Host: localhost:5000
Content-Type: application/json
cache-control: no-cache
Postman-Token: 1d94d81c-7d93-4cf6-865a-b8e3e28278c1
{
    "subject": "gpu",
    "filter": {
        "ids": [
            2,
            3
        ]
    }
}------WebKitFormBoundary7MA4YWxkTrZu0gW--

And flask code worked with methods=['GET']. So the question is, what can cause such behaviour?

koshachok
  • 298
  • 2
  • 15

1 Answers1

1

From jQuery documentation

data Type: PlainObject or String or Array Data to be sent to the server. It is converted to a query string, if not already a string. It's appended to the url for GET-requests. See processData option to prevent this automatic processing. Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same key based on the value of the traditional setting (described below).

If processData is set to false, it means that the data string is still appended to the URL, just without some processing.

This may be due to the behaviour of XMLHttpRequest.send()

send() accepts an optional parameter which lets you specify the request's body; this is primarily used for requests such as PUT. If the request method is GET or HEAD, the body parameter is ignored and the request body is set to null.

J.J. Hakala
  • 5,702
  • 6
  • 23
  • 52