2013-04-15 21 views
34

Sto tentando di inviare una richiesta POST Ajax utilizzando Jquery ma ho 400 errori di richiesta errati.Errore 400 richiesta errata in Jquery Ajax POST

Ecco il mio codice:

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: { 
    "subject:title":"Test Name", 
    "subject:description":"Creating test subject to check POST method API", 
    "sub:tags": ["facebook:work", "facebook:likes"], 
    "sampleSize" : 10, 
    "values": ["science", "machine-learning"] 
    }, 
    error: function(e) { 
    console.log(e); 
    } 
}); 

dice: Non è possibile costruire delle risorse da richiesta. Cosa mi manca?

+0

controllo preliminare: il browser è puntato a http: // localhost: 8080 /, giusto? –

+1

forse non è quello che sta causando il tuo problema, ma sembra che ["facebook: work, facebook: likes"] dovrebbe essere ["facebook: work", "facebook: likes"] – smerny

+0

Stai forse usando Java e Jersey? –

risposta

75

Infine, ho ottenuto l'errore e la ragione era che ho bisogno di stringa i i dati JSON che stavo inviando. Devo impostare il tipo di contenuto e il tipo di dati nell'oggetto XHR. Così la versione corretta è qui:

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: JSON.stringify({ 
    "subject:title":"Test Name", 
    "subject:description":"Creating test subject to check POST method API", 
    "sub:tags": ["facebook:work", "facebook:likes"], 
    "sampleSize" : 10, 
    "values": ["science", "machine-learning"] 
    }), 
    error: function(e) { 
    console.log(e); 
    }, 
    dataType: "json", 
    contentType: "application/json" 
}); 

Può essere che vi aiuterà a qualcun altro.

+4

Avrei potuto risparmiarmi un'ora di debugging frustrato se avessi trovato questo per cominciare. Grazie;) – bugsduggan

+5

Come disse una volta Thomas Edison, "Non hai fallito, hai imparato N modi in cui non funziona" in quell'ora, quindi sii contento che non l'hai trovato prima e hai cercato di risolvere il problema tu stesso . – sachinjain024

+1

Questo mi ha aiutato. Perché questo passaggio è necessario? – JasonTS

0

è necessario costruire query da "dati" oggetto utilizzando la seguente funzione

function buildQuery(obj) { 
     var Result= ''; 
     if(typeof(obj)== 'object') { 
      jQuery.each(obj, function(key, value) { 
       Result+= (Result) ? '&' : ''; 
       if(typeof(value)== 'object' && value.length) { 
        for(var i=0; i<value.length; i++) { 
         Result+= [key+'[]', encodeURIComponent(value[i])].join('='); 
        } 
       } else { 
        Result+= [key, encodeURIComponent(value)].join('='); 
       } 
      }); 
     } 
     return Result; 
    } 

e quindi procedere con

var data= { 
"subject:title":"Test Name", 
"subject:description":"Creating test subject to check POST method API", 
"sub:tags": ["facebook:work, facebook:likes"], 
"sampleSize" : 10, 
"values": ["science", "machine-learning"] 
} 

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: buildQuery(data), 
    error: function(e) { 
    console.log(e); 
    } 
}); 
+0

a cui non "devi", jQuery proverà a farlo per te. Tuttavia, se lo costruisci da solo, puoi garantire che sia nel formato in cui desideri che sia. –

+0

Non penso di aver bisogno di creare Object usando questo metodo. Jquery fa questo lavoro pesante per me. Inoltre, ogni volta che i dati vengono inviati tramite il metodo POST, vengono sempre codificati, quindi non è necessario utilizzare encodeURIComponent sui dati da inviare. – sachinjain024

2

La domanda è un po 'vecchia ... ma nel caso qualcuno faccia l'errore 400, potrebbe anche venire dalla necessità di inserire csrfToken come parametro per la richiesta di post.

Dovete ottenere nome e il valore delle imbarcazioni da nel modello:

<script type="text/javascript"> 
    window.csrfTokenName = "{{ craft.config.csrfTokenName|e('js') }}"; 
    window.csrfTokenValue = "{{ craft.request.csrfToken|e('js') }}"; 
</script> 

e passarli nella vostra richiesta

data: window.csrfTokenName+"="+window.csrfTokenValue 
+0

Nessuno ha menzionato Craft CMS qui? –

Problemi correlati