Как вернуть сообщение об ошибке?

Silentland

Новичок
В ответ на клиентский аякс-запрос сервер должен вернуть либо данные, либо сообщение об ошибке (например: "данные недоступны т.к. ведутся технические работы"). Можно ли вернуть сообщение об ошибке каким-нибудь другим способом, отличным от того, как возвращаются данные? В заголовок ответа запихать или еще как-то, чтобы разделить данные и техническую информацию?
 

Silentland

Новичок
А его можно как-то формировать? Там, если не ошибаюсь, коды 200, 405, 500 и т.п. Имеется в виду не критическая ошибка сервера, а ошибка обработки данных, когда ПХП скрипт выполнился до конца и выявил неисправность.
 

Фанат

oncle terrible
Команда форума
блин
ты определись уже, а?
то у тебя "данные недоступны, ведутся технические работы"
то "ошибка обработки данных"

если первое, то 503 без вариантов
 

Silentland

Новичок
"данные недоступны, ведутся технические работы" это мой текст сообщения об ошибке. Т.е. можно написать все что угодно "бухой админ всё похерил, восстановит завтра". Т.е. данных нет не потому что скрипт неисправен, просто их нет по каким-то своим причинам.

Сейчас сообщение об ошибке у меня уходит с кодом 200 (не знаю как его поменять) и получается клиентом как данные. А хотелось бы чтобы в данных было пусто, но клиент как-то узнал что была ошибка (и желательно её текст)

P.S. Ну и мой коронный вопрос. Что по поводу передачи на клиент статуса ошибки говорит программисткая практика? )
 

Silentland

Новичок
Видел. 204 код нравится. Как понимаю, его можно передать так: header("Текст ошибки", 204)?

А теперь расскажу о своей гениальной идее, зачем это нужно. Любые аякс-библиотеки содержат две функции success (data) и error (status, etc.) И было бы удобно обрабатывать в error любые ошибки, в т.ч. придуманные сервером. Или может быть все уже давно так делают?
 

Silentland

Новичок
Хорошо. Мой браузер принимает такие поля
PHP:
cache-control: "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
connection: "Keep-Alive"
content-length: "2775"
content-type: "text/html"
date: "Tue, 02 Jul 2013 19:01:44 GMT"
expires: "Thu, 19 Nov 1981 08:52:00 GMT"
keep-alive: "timeout=5, max=91"
pragma: "no-cache"
server: "Apache"
В спецификации указаны такие
PHP:
Age                     ; Раздел 14.6
Location                ; Раздел 14.30
Proxy-Authenticate      ; Раздел 14.33
Public                  ; Раздел 14.35
Retry-After             ; Раздел 14.38
Server                  ; Раздел 14.39
Vary                    ; Раздел 14.43
Warning                 ; Раздел 14.45
WWW-Authenticate        ; Раздел 14.46
А мне нужно всего лишь знать в какое поле можно записать свой текст, чтобы браузеры его гарантированно распознали (хотя бы современные).

P.S. С 204 кодом, наверное, оплошал. Он же не будет ошибочным восприниматься
 

Вурдалак

Продвинутый новичок
Silentland, тебе Фанат дал ссылку, почему ты решил проигнорировать?
 

Фанат

oncle terrible
Команда форума
Вот не знаю, почему твои долгие, пространные и правильные рассуждения вызывают во мне раздражение.
И не придерёшься ведь. Действительно - посмотрел в браузер, посмотрел в спецификацию...

Может быть потому, что ты ищешь оправдания, почему так сделать невозможно, а не способы, как сделать?

Ну ё-моё, ну уже день сопли жуёшь при том, что тебе давно сказали как сделать. Ну погугли ты хотя бы использование кода статуса. Ну хоть что-нибудь попробуй сделать, вместо академических рассуждений и плавных пассов руками - "а вот коронный вопрооооооос", "а что нам говорит праааактика"? ГУГЛЬ В ЗУБЫ и через 5 секунд узнал, что нам говорит практика!
Тьфу, тягомотина
 

Фанат

oncle terrible
Команда форума
"данные недоступны, ведутся технические работы"
Это не твой текст об ошибке, а узость мышления. Ты предполагаешь, что все ошибки будешь контролировать и будешь что-то там писать.
ЭТО НЕ ТАК.

Если произошла ошибка, то ЛЮБОЙ пхп скрипт должен отдать клиенту 503. Неважно - аякс, шмаякс, или обычный.
Если он вызывается аяксом, то аякс должен уметь понимать 503 - не запланированную тобой, а любую - и писать вот это самое "данные недоступны, ведутся технические работы".
То же самое касается 404 и всех прочих.

Это если речь об ошибке скрипта. Неважно, повторюсь, чем вызванной.

Если же это ошибка входящих данных, то никто не мешает тебе посылать чуть более комплексный джейсон в ответ - не только блок данных но и блок с сообщениями об ошибках.
 

Фанат

oncle terrible
Команда форума
чтобы браузеры его гарантированно распознали
1. Браузеры прекрасно распознают коды статусов
2. В случая аякса браузером выступает твой ЖС скрипт. И распознает он только то, что ты сам ему напишешь
 

Silentland

Новичок
Ну ладно-ладно, разбираюсь я сам, не надо тут. Спецификация не говорит что конкретно нужно отсылать, а такое http://krisjordan.com/php-class-for-http-response-status-codes за пять минут не гуглится.

Не предполагаю, что все ошибки буду контролировать. Но ошибка скрипта и так автоматом присылается с 503 статусом и нормально распознается, а для ошибки данных я раньше слал описание ошибки с кодом 200 (и никто мне, кстати, не сказал что так неправильно и гугл не сказал!), поэтому получил гору проблем. Вчера разобрался как получать данные в теле сообщения при ошибочном статусе, так что вопрос о передаче данных в заголовке отпадает.

Собственно, теперь остается подобрать логичные коды ошибок для разных ситуаций, но в Википедии это подробно описано.
 

Фанат

oncle terrible
Команда форума
Почему ты считаешь, что ошибки данных с кодом 200 слать неправильно?
Не, ну по стандарту, возможно, и надо какой-нибудь бэд реквест, но классические веб-приложения же 200 отправляют и не жужжат.
Какие проблемы ты получил?
 

hell0w0rd

Продвинутый новичок
https://github.com/piece/stagehand-http-status зато гитхабится за 2 минуты:)
Есть кстати вроде два варианта отправки статусов, через http-коды, или через json, в котором есть errno, error, data, ибо без разницы где передавать состояние, просто парсить его прийдется по разному:)
 

Silentland

Новичок
Какие проблемы ты получил?
Обрабатываю ответ сервера REST библиотекой из Ангуляра. Там есть функция запрашивающая весь массив данных и создающая на каждый элемент по ресурсу. Так вот, если в ответ приходит не массив, а строка ошибки, то она просто разбивается по буквам и получается бред. Использовать из-за этого какие-то сторонние решения или что-то сложное накручивать не хочется, поэтому проще изменить формат ошибки. И тут было два варианта:
1. Передавать строку с сообщением об ошибке в каком-либо поле заголовка (кроме заголовка для тела)
2. Передавать строку с ошибочным кодом, чтобы она попала в обработчик error. Этот вариант видится более логичным.

Поэтому теперь считаю, что передавать ошибку с кодом 200 недопустимо ни в каких случаях. Уж при аякс-запросах точно.

Есть кстати вроде два варианта отправки статусов
Можно подробнее? Ну не гуглится и не гитхабится у меня всё это, хоть ты тресни :)
 

hell0w0rd

Продвинутый новичок
Silentland
а чего подробнее?
PHP:
{
    "errno": 2,
    "error": "Technical works",
    "data": ""
}
{
    "errno": 0,
    "error": "",
    "data": {
        mydata: 123
    }
}
на мой взгляд проще отдавать состояние в header. Тут считается плохой практикой, но в симфони например очень даже используется - создаешь набор исключений, аля BadDataException, BadRequestExseption, PageNotFoundException, а дальше свой перехват исключений, который эти исключения конвертирует в заголовки, таким образом из любого места можно выкинуть ошибку, а в логах всегда понять что ее выкинуло
 

Silentland

Новичок
А можно полный код на ПХП, как формируется ответ функцией header, куда все эти данные записывать? Собственно, в самом начале спрашивал, как передать данные в заголовке (не в теле сообщения)
 
Сверху