2013-04-15 12 views
34

Próbuję wysłać żądanie Ajax POST za pomocą Jquery, ale mam 400 nieprawidłowy błąd żądania.Otrzymywanie błędu 400 nieprawidłowych żądań w Jquery Ajax POST

Oto mój kod:

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

ona mówi: Nie można zbudować z zasobu zamówienie. Czego mi brakuje?

+0

Wstępne sprawdzenie: Twoja przeglądarka jest skierowany do http: // localhost: 8080 /, prawda? –

+1

Może nie jest to przyczyną problemu, ale wygląda na to, że ["facebook: work, facebook: likes"] powinno być ["facebook: work", "facebook: likes"] – smerny

+0

Czy używasz Java i Jersey? –

Odpowiedz

75

Wreszcie, mam błąd, a powodem było muszę stringify dane JSON, które wysyłałem. Muszę ustawić typ zawartości i typ danych w obiekcie XHR. więc poprawna wersja jest tutaj:

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

Może to pomoże kogoś innego.

+4

Mogłem zaoszczędzić godzinę frustracji, jeśli znajdę to na początku. Dzięki;) – bugsduggan

+5

Tak jak powiedział Thomas Edison: "Nie zawiedliście, nauczyliście się N sposobów, które nie zadziałają" w tej godzinie. Więc cieszcie się, że nie znaleźliście go wcześniej i próbowaliście rozwiązać problem samemu. . – sachinjain024

+1

To mi pomogło. Dlaczego ten krok jest konieczny? – JasonTS

0

Trzeba zbudować kwerendę z „dane” obiektu za pomocą następujących funkcji

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

a następnie postępuj zgodnie ze wskazówkami

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

nie "musisz", jQuery spróbuje zrobić to za Ciebie. Chociaż, jeśli zbudujesz to sam, możesz zagwarantować, że jest w formacie, w którym chcesz go umieścić. –

+0

Nie potrzebuję budować obiektu w ten sposób. Jquery robi to dla mnie. Co więcej, zawsze, gdy dane są przesyłane za pomocą metody POST, zawsze jest ona kodowana, więc nie musimy używać encodeURIC Component w celu przesłania danych. – sachinjain024

2

Pytanie jest nieco stare ... ale na wypadek, gdyby ktoś napotkał błąd 400, może to również wynikać z potrzeby wysłania csrfToken jako parametru do żądania wpisu.

Musisz uzyskać nazwę i wartość z rzemiosła w szablonie:

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

i przekazać je w swoim wniosku

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

Nikt nie wspomniał tutaj o Craft CMS? –

Powiązane problemy