2011-03-17 2 views
6

Я реализую приложение, которое полагается на связь между клиентом JavaScript и сервером, который знает, как реагировать на клиента с использованием нотации JSONP.Анализ JSONP-ответа в Javascript при наличии 4xx или 5xx кода ошибки Http

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

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

Неужели кому-то повезло в том, что он все еще разобрал ответ jsonp, хотя код статуса http - 4xx или 5xx?

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

EDIT: Я временно возвращаю код статуса 200, когда мой сервер обнаруживает jsonp-клиент, а затем туннелирует сообщение об ошибке/статус в возвращаемом объекте json. Я надеялся воспользоваться кодами статуса HTTP, но я думаю, что это не для javscript-клиента.

ответ

7

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

callback(result, status, message) 

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

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

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

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

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

fn(null, 500, "server error"} 
+0

Любая идея о том, как это можно достичь с помощью проекта Lumen/Laravel? – jtanmay

-3

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

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

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

+1

I'm usin g JSONP для обхода ограничений перекрестных доменов. http://en.wikipedia.org/wiki/JSON#JSONP Раздел 8.1 –

+1

@Macy Похоже, мне нужен сон: p Так или иначе, есть аналогичное обсуждение [здесь] (http://stackoverflow.com/questions/1002367/jquery-ajax-jsonp-ignores-a-timeout-and-doesnt- противопожарная-ошибки события). – Haochi

+0

классный, спасибо за эту ссылку –

8

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

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

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

+0

Является ли отсутствие поддержки кросс-браузера для CORS значительной проблемой, на ваш взгляд? http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing –

+1

Это серьезная проблема, но все остальные решения. CORS работает в большинстве новых браузеров (включая мобильное сафари), но не работает на старых браузерах. Flash универсален на рабочем столе, но не работает на мобильных устройствах. Прокси-сервер на стороне сервера работает везде, но требует дополнительной работы. У JSONP нет обработки ошибок. Выберите меньшее количество зла. –