Obteniendo 400 error de solicitud incorrecta en Jquery Ajax POST
http-status-code-400 (4)
Estoy intentando enviar una solicitud POST de Ajax utilizando Jquery, pero estoy teniendo un error de solicitud incorrecta de 400.
Aquí está mi código:
$.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: No se puede generar recurso a partir de la solicitud. Qué me estoy perdiendo ?
Finalmente, recibí el error y la razón era que necesitaba codificar los datos JSON que estaba enviando. Tengo que establecer el tipo de contenido y el tipo de datos en el objeto XHR. Entonces la versión correcta está aquí:
$.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"
});
Puede ser que ayudará a alguien más.
La pregunta es un poco antigua ... pero solo en caso de que alguien se enfrente al error 400, también puede deberse a la necesidad de publicar csrfToken como un parámetro para la solicitud posterior.
Debes obtener el nombre y el valor de la artesanía en tu plantilla:
<script type="text/javascript">
window.csrfTokenName = "{{ craft.config.csrfTokenName|e(''js'') }}";
window.csrfTokenValue = "{{ craft.request.csrfToken|e(''js'') }}";
</script>
y páselos en su solicitud
data: window.csrfTokenName+"="+window.csrfTokenValue
Necesita generar una consulta del objeto "data" usando la siguiente función
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;
}
y luego proceder 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);
}
});
Sí. Necesita stringify
los datos JSON
o se produce un error de 400 bad request
errores, ya que no puede identificar los datos.
400 Bad Request
Solicitud incorrecta. Su navegador envió una solicitud que este servidor no pudo entender.
Además, necesita agregar content type
y content type
datatype
también. Si no, encontrará un error 415
que dice Unsupported Media Type
.
415 Tipo de medio no admitido
Prueba esto.
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 esta forma, puede modificar los datos que necesita con facilidad. No te confundirá ya que se define fuera del bloque ajax.