jQuery postando json válido no corpo da solicitação

180

Portanto, de acordo com os documentos do jQuery Ajax , ele serializa dados na forma de uma string de consulta ao enviar solicitações, mas a configuração processData:falsedeve permitir o envio de JSON real no corpo. Infelizmente, estou tendo dificuldade para determinar primeiro, se isso está acontecendo, e em segundo lugar como o objeto está sendo enviado ao servidor. Tudo o que sei é que o servidor não está analisando o que estou enviando.

Ao usar o cliente http para postar um objeto literal {someKey:'someData'}, ele funciona. Mas ao usar o jQuery data: {someKey:'someData'}, ele falha. Infelizmente, quando analiso a solicitação no Safari, ele diz que a carga útil da mensagem é [object Object]... ótima ... e no Firefox a postagem está em branco ...

Ao registrar o conteúdo do corpo no lado Java, ele fica literalmente, [object Object]então como enviar dados REAL JSON ??

Alguém já teve experiência com um serviço Java serializando dados JSON no corpo da solicitação, com a solicitação enviada pelo jQuery?

Entre aqui está a solicitação $ .ajax completa:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});
Brad
fonte

Respostas:

292

Uma solicitação JSON real ficaria assim:

data: '{"command":"on"}',

Para onde você está enviando uma string JSON real. Para uma solução mais geral, use JSON.stringify()para serializar um objeto para JSON, assim:

data: JSON.stringify({ "command": "on" }),

Para dar suporte a navegadores mais antigos que não possuem o JSONobjeto, use o json2.js que o adicionará.


O que está acontecendo atualmente é que, como você tem processData: false, está basicamente enviando o seguinte: o ({"command":"on"}).toString()que é [object Object]... o que você vê em sua solicitação.

Nick Craver
fonte
então não preciso mais do processData: false usando JSON.stringify()?
brad
6
@brad - correto, não importa depois de fazer isso, porque é uma string e, nesse caso, o jQuery não processará mais .
Nick Craver
2
funcionou como um encanto, muito obrigado! É verdade que todos os corpos de solicitação devem ser cadeias de caracteres analisadas do outro lado?
brad
Por que o jQuery analisa a datastring em vez de apenas enviá-la como JSON?
Adam Zerner
Nota lateral: se alguém precisar dele como uma "carga útil da solicitação do corpo" em vez de dados do formulário, não se esqueça de incluir contentType: "application/json; charset=utf-8",o mencionado neste tópico: stackoverflow.com/questions/21201270/…
raydlevel5 17/06