#jquery #ajax
#jquery #ajax
Вопрос:
У меня есть функция jQuery ajax, которая отвечает HTML при сбое вызова. Если вызов успешен, он отвечает JSON: {"result":true}
$.ajax({
type: 'POST',
dataType: 'html',
success: function (response) {
if (response.RESULT === true) {
window.location.replace(baseUrl);
} // else do something else and show errors
}
});
Однако Firefox не распознает результат в формате JSON, поскольку для типа данных установлено значение ‘html’. Я попытался оставить его пустым, и это не сработало. Есть ли обходной путь, или это плохая практика возвращать две вещи?
Это для регистрационной формы. Я возвращаю HTML, потому что так проще показывать ошибки проверки пользователя (на стороне сервера), в то время как в случае успешной регистрации я перенаправляю их.
Ответ №1:
Я думаю, что вызов AJAX всегда должен возвращать данные в том же формате. Не рекомендуется возвращать HTML только в случае сбоя вызова. Вы всегда можете вернуть ответ JSON с параметром состояния, который может быть успешным или ошибкой, и параметром содержимого, который является ответом HTML.
Ответ №2:
Это плохая практика, возвращающая два разных формата данных. Потребители сервиса не будут знать, чего ожидать, и также плохой практикой является изменение формата в соответствующей группе сервисов (хотя некоторые исключительные сценарии оправдывают это)
В вашем случае :
Вместо этого вы можете постоянно возвращать JSON, а в случае ошибок возвращать JSON в этом формате :
{
"errorsHtml" : "<div class='errors'>...</div>"
}
И вы также можете использовать заголовки кода состояния HTTP для обозначения состояния сервера, например, статус 500 — внутренняя ошибка сервера. Вы можете обрабатывать различные коды состояния следующим образом :
$.ajax({
statusCode: {
404: function() {
alert('page not found');
}
}
});
Ответ №3:
Это плохая практика, хотя и не конец света. Я бы предпочел назвать это «взломом». Статус запроса должен основываться на коде ответа (200 — OK, ошибка содержимого 40x, ошибка сервера 50x).
Ответ №4:
Хорошей практикой является возврат запрошенного типа данных. Это так просто. Непоследовательная отправка данных может работать в краткосрочной перспективе, но в конечном итоге вы столкнетесь с долгосрочными проблемами с ремонтопригодностью, когда забудете, почему вы решили вернуть JSON в одной ситуации и HTML в другой.
Существует много способов запроса данных, мой личный фаворит — реализация запроса RESTful. Существует много способов реализации RESTful-системы.
Если вы собираетесь отправить запрос www.example.com/cars
, вы, вероятно, получите список автомобилей, но у сервера нет хорошего способа узнать, как вы хотите, чтобы этот список автомобилей был отформатирован.
Простой способ указать, что вы хотите, — добавить суффикс: www.example.com/cars?type=HTML
может быть достаточно описательным, чтобы уведомить сервер, какой тип данных вы хотите…
Разве не было бы удобно, если бы был способ указать, какой тип данных вы ожидаете получить обратно с сервера, не загрязняя строку запроса?
Оказывается, есть способ…расширения файлов: www.example.com/cars.html
очень специфично для того, какой тип данных должен быть возвращен, и вы не будете смущены через 6 месяцев, когда вам нужно будет отследить эту ошибку, потому что вы будете знать, что запрос на стороне клиента ожидает HTML.
www.example.com/cars.js
или www.example.com/cars.json
может возвращать данные другого типа, и вы никогда не будете смущены тем, что запрос должен возвращать клиенту.
Лучшая часть использования RESTful-реализации заключается в том, что вы можете выдавать ошибки вашего запроса в виде кодов состояния HTTP. Неверно сформированный запрос? отправьте 400
сообщение об ошибке. Неправильные разрешения? отправьте 403
.
Привяжите обработчик ошибок к AJAX-запросу, и вы сможете легко отличить возвращаемый JSON «success» от JSON «error».
Если вам действительно нужен HTML, когда ожидается JSON, просто JSON кодирует его в объекте как {"error":"your html <strong>here</strong>"}
Ответ №5:
Не указывайте тип данных —
если не указан ни один, jQuery попытается вывести его на основе MIME-типа ответа
Указать несколько значений нормально и разрешено —
несколько значений, разделенных пробелами: начиная с jQuery 1.5, jQuery может преобразовать тип данных из того, что он получил в заголовке Content-Type, в то, что вам требуется. Например, если вы хотите, чтобы текстовый ответ обрабатывался как XML, используйте «text xml» для типа данных.
$.ajax({
type: 'POST'
dataType: 'html json',
success: function (response) {
if (response.RESULT === true) {
window.location.replace(baseUrl);
} // else do something else and show errors
}
});
http://api.jquery.com/jQuery.ajax / — ознакомьтесь с описанием типа данных.
Комментарии:
1. Это не означает, что сервер может возвращать все, что захочет — в вашем случае возвращаемые данные всегда преобразуются в JSON, даже если они в HTML, и не будут работать, когда сервер фактически возвращает HTML в одном случае и json в другом случае
2. конечно, это не означает, что сервер может возвращать что угодно, но все равно нормально.
3. Вы отредактировали свой ответ и сказали jquery преобразовать json в html, другими словами, даже если тип содержимого text / html, jquery будет обрабатывать его как данные json. Хорошо, теперь, что происходит, когда сервер возвращает json, а клиентская сторона также хочет json для вызова? Однако спасибо, что поделились этим, я не знал, что такая функция существует в jquery