Получение 400 плохой ошибки запроса в jQuery Ajax POST

Я пытаюсь отправить запрос Ajax POST с помощью Jquery, но у меня 400 плохая ошибка запроса.

вот мой код:

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

Он говорит: не может построить ресурс из запроса. Что я упускаю ?

4 ответов


наконец, я получил ошибку, и причина заключалась в том, что мне нужно было stringify данные JSON, которые я отправлял. Я должен установить тип контента и тип данных в объекте XHR. Итак, правильная версия здесь:

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

может быть это поможет кому-то еще.


вопрос немного старая... но на случай, если кто-то столкнется с ошибкой 400, это также может произойти из-за необходимости опубликовать csrfToken в качестве параметра запроса post.

вы должны получить имя и значение из корабля в вашем шаблоне :

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

и передайте их в вашем запросе

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

вам нужно построить запрос из объекта "данные", используя следующую функцию

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

и затем приступить с

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

да. Вам нужно stringify на JSON данные orlse 400 bad request ошибка возникает, поскольку она не может идентифицировать данные.

400 Bad Request

Неверный Запрос. Ваш браузер послал запрос, что этот сервер не мог понимать.

плюс вам нужно добавить content type и datatype как хорошо. Если нет, вы столкнетесь 415 ошибки, которая говорит Unsupported Media Type.

415 Неподдерживаемый Тип Медиа

попробуйте это.

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

таким образом, вы можете легко изменить необходимые вам данные. Это не будет путать вас, как это определено вне блока ajax.