web-dev-qa-db-fra.com

Obtention d'une erreur de requête incorrecte 400 dans Jquery Ajax POST

J'essaie d'envoyer une requête Ajax POST à l'aide de Jquery mais je rencontre une erreur de 400 requêtes incorrectes.

Voici mon 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);
  }
});

It Says: Impossible de construire une ressource à partir de request . Qu'est-ce qui me manque?

40
sachinjain024

Enfin, j'ai eu l'erreur et la raison était que je devais renforcer les données JSON que j'envoyais. Je dois définir le type de contenu et le type de données dans l'objet XHR . La version correcte est donc ici:

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

Peut-être que cela aidera quelqu'un d'autre.

85
sachinjain024

La question est un peu ancienne ... mais juste au cas où quelqu'un rencontrerait l'erreur 400, cela pourrait aussi venir de la nécessité de poster csrfToken en tant que paramètre de la requête de publication.

Vous devez obtenir le nom et la valeur de l'artisanat dans votre modèle:

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

et passez-les dans votre demande

data: window.csrfTokenName+"="+window.csrfTokenValue
1
Benoît Schiex

Vous devez créer une requête à partir d'un objet "data" à l'aide de la fonction suivante

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

et ensuite procéder avec

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
Christian Ezeani

Oui. Vous devez stringify l'erreur JSON data orlse 400 bad request car elle ne peut pas identifier les données. 

400 Bad Request

Mauvaise Demande. Votre navigateur a demandé que ce serveur ne puisse pas comprendre.

De plus, vous devez également ajouter content type et datatype. Sinon, vous rencontrerez une erreur 415 qui dit Unsupported Media Type.

415 Type de support non pris en charge

Essaye ça. 

var newData =   {
                  "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"]
                  };

var dataJson = JSON.stringify(newData);

$.ajax({
  type: 'POST',
  url: "http://localhost:8080/project/server/rest/subjects",
  data: dataJson,
  error: function(e) {
    console.log(e);
  },
  dataType: "json",
  contentType: "application/json"
});

De cette façon, vous pouvez facilement modifier les données dont vous avez besoin. Cela ne vous déroutera pas car il est défini en dehors du bloc ajax.

0
Dulith De Costa