У меня есть веб-сайт, использующий ASP.NET, которому необходимо получить некоторые данные из CloudKit. Я использую CloudKit JS, получаю запись из CloudKit и отправляю данные на сервер из своего JavaScript с помощью C#. Я могу преобразовать объект JSON полученной записи в строку с помощью JSON.stringify(record);
, но не могу отправить его на сервер с помощью AJAX. Вот мой код для отправки данных с помощью AJAX:
function afterRecordLoaded(record) {
var decodedRecord = JSON.stringify(record);
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "/receive?type=specific&" + "data = " + decodedRecord, true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send();
}
afterRecordLoaded(record);
Когда я перехожу к консоли в инструментах разработчика браузера, я могу правильно выполнить запрос, если это делается вручную, но когда AJAX делает это, он получает ошибку HTTP 400. Другими словами, я могу выполнить запрос, когда я набираю URL-адрес ( с правильными параметрами) в адресную строку, но когда тот же URL-адрес (с теми же параметрами) используется AJAX, он не работает и возвращает ошибку HTTP 400.
Вот мой код С# для страницы, которая получает запрос:
var token = antiforgery.GetAndStoreTokens(HttpContext).RequestToken;
var type = Request.Query["type"];
var data = Request.Query["data"];
if (type == "specific")
{
if (data != "")
{
PostProcessor.processPostData(data);
}
else
{
Response.StatusCode = 400;
}
}
Выполняя простой поиск в Google, я вижу, что другие тоже сталкиваются с этой проблемой, и чтобы обойти ее, они используют токен защиты от подделки. Я не уверен, как реализовать токены защиты от подделки, если это необходимо. Было бы здорово, если бы у кого-нибудь было решение избавиться от ошибки HTTP 400 или внедрить токен защиты от подделки, чтобы ошибка исчезла. Извините, если этот вопрос встречается повсюду или слишком очевиден, поскольку я новичок в ASP. Спасибо.
может быть, когда вы отправляете в консоль, данные не пусты. пока данные пусты с XHR в вашем коде, запрос затем введите выражение asp.net else Response.StatusCode = 400;
.
я думаю, может быть, в вашем коде JSON.stringify(record)
есть некоторые ошибки, чтобы ничего не возвращать.
более того, когда вы используете почтовый запрос, данные (реальная полезная нагрузка) не должны отправляться, как ваш стиль, в качестве параметра запроса, они должны быть в такой полезной нагрузке.
var decodedRecord = JSON.stringify(record);
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "/receive?type=specific", true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(decodedRecord );
когда вы делаете это вручную, я думаю, вы все еще используете xmlhttprequest в консоли, иначе вы не можете найти проблему. просто вставьте свой код выше в консоль (сначала добавьте данные записи, как это должно быть в консоли), посмотрите, что произойдет
Решение очень простое. Я использовал формат запроса GET, а не запроса POST. Все, что мне нужно было сделать, это изменить xmlhttp.open("POST", "/receive?type=specific&" + "data = " + decodedRecord, true);
на xmlhttp.open("GET", "/receive?type=specific&" + "data = " + decodedRecord, true);
.
Переменная данных не пуста. Я могу получить то, что мне нужно, когда я обращаюсь к этому URL-адресу вручную. Я просто не могу этого сделать, когда это делает AJAX.