2011-04-12 13 views
6

Estoy construyendo una aplicación web, y me pregunto cómo manejar los errores con mis llamadas AJAX. Por ejemplo, si el usuario ingresa algún tipo de información que no es válida (dirección de correo electrónico incorrecta, el usuario ya existe) quiero poder lanzar un error desde PHP.Errores personalizados de PHP para llamadas AJAX

He visto aquí http://php4every1.com/tutorials/jquery-ajax-tutorial/ que puede utilizar un objeto JSON y manejar el informe de errores de la función de éxito de JQuery, pero esa no parece la forma correcta de hacerlo. Tendría sentido para mí que se utilice la función de error de jQuery cuando hay un error. Supongo que soy un fanático de ese tipo de cosas.

Así es como lo estoy haciendo ahora mismo.

//In my PHP file called from JQuery 
function error($msg) { 
    header("HTTP/1.0 555 ".$msg); 
    die(); 
} 
//Then that error is handled accordingly from JQuery 

Así que estoy creando un código de error 555 que no se define como cualquier cosa y viradas en mi propio mensaje de error personalizado. ¿Es esa la manera correcta de hacer esto? ¿Debo usar JSON? Tiene que haber una forma estándar de enviar mensajes de error como este, ¿no?

Si necesita ver más de mi código para obtener una mejor idea, todo el proyecto está en github: https://github.com/josephwegner/fileDrop. El archivo en cuestión es config/phpFuncts.php.

+1

No hay razón para crear un nuevo código de estado de este, 400 estaría bien si se trata de un error de validación de entrada del usuario. Se puede considerar una solicitud incorrecta (como en, su cuerpo de solicitud, su entrada de usuario, está mal formado). – Fleep

Respuesta

6

Solo usaría un objeto JSON y un encabezado HTTP de 200. No había nada de malo con la solicitud en sí, y su servidor se comportó como se suponía que debía - el error estaba en una capa diferente de la abstracción.

2

La familia 400 de HTTP status codes indica que hubo un problema con la solicitud. Establecería el código de respuesta en 400 e incluiría la lista de mensajes de error en el cuerpo de la respuesta como JSON.

+0

De acuerdo. Para los errores que el usuario puede corregir, use 400 Bad Request (como en, tienen errores de validación, etc.). Para excepciones de servidor como fallas de DB, errores fatales, etc. use los códigos de estado de 500 niveles. – Fleep

+0

@Fleep Yup thats right – Michael

2

Odio el uso de códigos de estado HTTP para indicar fallas. Los códigos HTTP deben reservarse para los errores reales del nivel HTTP, y los errores relacionados con la solicitud AJAX deben enviarse nuevamente a través de una estructura JSON.

p. Ej.

$data = array() 
if (some big ugly computation fails) { 
    $data['errorcode'] = -123; 
    $data['error'] = true; 
    $data['success'] = false; 
    $data['errormessage'] = 'some helpful error message'; 
} else { 
    $data['success'] = true; 
    $data['error'] = false; 
    $data['response'] = 'whatever you wanted to send back....'; 
} 
echo json_encode($data); 

A continuación, en el lado del cliente

if (data.error) { 
    alert('Request blew up: ' + data.errormessage); 
} 
+1

No estoy de acuerdo con el "Los códigos HTTP deben reservarse para los errores reales del nivel HTTP". HTTP es un protocolo y los códigos de estado reflejan la respuesta del servicio. Los códigos de respuesta 4xx se deben usar para problemas de los que el cliente es responsable. Los códigos de respuesta 5xx se deben usar para problemas que el servidor es responsable del – Fleep

+2

. Si conduzco a la tienda y no tienen lo que quiero, no lo hago. El viaje fue un fracaso, el automóvil funcionó, aparqué correctamente, llegué a casa, llegué a casa con las manos vacías. Los errores con un servicio AJAX se deben señalar en el texto de respuesta del servicio, no en el nivel HTTP. devolver 404 en una llamada ajax "fallida" debería significar "hey, falta el archivo de servicio", no "lo siento, ese registro en la base de datos no existe". –

+0

Los códigos de estado HTTP están destinados a ser utilizados de esa manera. una "Solicitud Mala 400" no significa que el HTTP falló. Si HTTP fallara, no obtendría ninguna respuesta de error. HTTP no informa sobre su propio rendimiento. – Fleep

Cuestiones relacionadas