2013-04-15 6 views
34

erhalten Ich versuche, eine Ajax POST-Anfrage mit Jquery zu senden, aber ich habe 400 ungültige Anforderungsfehler.400 fehlerhafte Anforderungsfehler in Jquery Ajax POST

Hier ist mein Code:

$.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); 
    } 
}); 

Dort heißt es: Kann nicht Ressource Anfrage bauen. Was fehlt mir?

+0

Die vorläufige Prüfung: Ihrem Browser http gerichtet ist: // localhost: 8080 /, richtig? –

+1

vielleicht nicht, was Ihr Problem verursacht, aber es sieht aus wie ["Facebook: Arbeit, Facebook: Likes"] sollte ["Facebook: Arbeit", "Facebook: Likes"] – smerny

+0

Verwenden Sie Java und Jersey vielleicht? –

Antwort

75

gehen Schließlich habe ich den Fehler, und der Grund war, ich muss stringify die JSON-Daten, die ich gesendet habe. Ich muss den Inhaltstyp und den Datentyp im XHR-Objekt einstellen. So ist die richtige Version hier:

$.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" 
}); 

Vielleicht ist es jemand anderes helfen.

+4

Ich hätte mir eine Stunde frustriertes Debugging ersparen können, wenn ich das erst einmal gefunden hätte. Danke;) – bugsduggan

+5

Wie Thomas Edison einmal sagte: "Du hast nicht versagt, du hast in dieser Stunde n Wege gelernt, die nicht funktionieren werden" Also sei froh, dass du es früher nicht gefunden hast und versucht hast, das Problem selbst zu lösen . – sachinjain024

+1

Das hat mir geholfen. Warum ist dieser Schritt notwendig? – JasonTS

0

Sie benötigen Abfrage erstellen aus „Daten“ Objekt unter Verwendung der folgenden Funktion

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; 
    } 

und dann mit

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

Sie nicht haben, wird jQuery versuchen, es für Sie zu tun. Obwohl du es selbst erstellst, kannst du garantieren, dass es in dem Format ist, in dem es sein soll. –

+0

Ich glaube nicht, dass ich das Objekt auf diese Weise erstellen muss. Jquery macht dieses schwere Heben für mich. Darüber hinaus wird jedes Mal, wenn Daten über die POST-Methode gesendet werden, diese codiert, so dass encodeURIComponent nicht über die zu sendenden Daten verwendet werden muss. – sachinjain024

2

Die Frage ist ein bisschen alt ... aber nur für den Fall, dass jemand den Fehler 400 konfrontiert, kann es auch von der Notwendigkeit kommen, csrfToken als Parameter auf die Post-Anfrage zu buchen.

Sie müssen Namen und den Wert von Handwerk in der Vorlage erhalten:

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

und geben sie in Ihrer Anfrage

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

Niemand hat Craft CMS hier erwähnt? –