Анализ ответа JSONP в Javascript при наличии кода ошибки 4xx или 5xx Http - PullRequest
6 голосов
/ 17 марта 2011

Я реализую приложение, которое опирается на связь между клиентом JavaScript и сервером, который знает, как ответить клиенту с использованием нотации JSONP.

Я пытаюсь обработать случай в моем клиенте Javascript, когда мой сервер возвращается с кодом состояния http 4xx или 5xx. В настоящее время я вижу, что скрипт не оценивается, так как браузер считает его ошибкой (что и есть). Однако я все еще хочу прочитать, что мой сервер должен сказать в случае ответа 4xx или 5xx код в моем клиенте JavaScript.

Я вижу, что это вызывает ошибку в элементе тега script, но я обеспокоен тем, что это не кросс-браузер и не будет надежным решением.

Кому-нибудь повезло с анализом ответа jsonp, хотя http-код состояния 4xx или 5xx?

Я начинаю верить, что мне следует просто использовать это решение «установить тайм-аут», которое «обнаруживает» ошибку, сообщая, что функция обратного вызова для запроса jsonp будет завершена в течение определенного периода времени, а если нет, произошла ошибка.

РЕДАКТИРОВАТЬ: я временно всегда возвращаю 200 кодов состояния, когда мой сервер обнаруживает клиент jsonp и затем туннелирует сообщение об ошибке / статус в возвращенном объекте json. Я надеялся воспользоваться кодами состояния HTTP, но думаю, что для клиента javscript ничего не выйдет.

Ответы [ 3 ]

8 голосов
/ 17 марта 2011

JSONP - это способ решения междоменных проблем. Когда это работает, это работает хорошо. Но когда это не так, у вас нет способа выяснить, что пошло не так.

setTimeout - это еще один хак поверх оригинального. Если вы должны использовать JSONP и все еще нуждаетесь в обнаружении ошибок (не в обработке), это то, что вам нужно сделать. Нет лучшего решения.

Если вы управляете сервером, попробуйте использовать альтернативы, такие как Cross-Origin-Resource-Sharing (CORS) или Flashdomain.xml, чтобы разрешить междоменные запросы. Если вы не контролируете сервер, вы можете прокси-ответ через ваш сервер, чтобы получить лучший контроль.

7 голосов
/ 14 апреля 2011

Один из подходов при использовании JSONP - встраивать информацию о состоянии в обратный вызов.Таким образом, подпись функции обратного вызова будет выглядеть как

callback(result, status, message)

Так что, если ваш вызов выглядит как

http://myurl.com/?callback=fn

, сгенерируйте код для успешного вызова, который выглядит как

fn({"data":"my great data"}, 200)

и за исключительное состояние

fn(null, 500, "server error"}
0 голосов
/ 17 марта 2011

Вы можете проверить status объекта XHR (если вы не используете библиотеку JS).

if(xhr.readyState == 4){
  if(xhr.status == 200){
    // good
  }else if(xhr.status == 502){
    // d'oh
  }
}

Если вы используете jQuery, вы можете передать statusCode для обработкиособые случаи для $. ajax

...