Обработка статусов сервера

Допустим у нас клиент-серверное приложение средней руки, транспорт осуществяется при помощи AJAX, а в качестве фреймвока jQuery. Если бы на сервере был руби то статусы запросто можно было бы отдавать ввиде HTTP заголовков, и обрабатывать их нативно.


$.ajaxSetup({
	statusCode: {
		401: function() {
			console.log("user not authorized");
		},
		403: function() {
			console.log("access denided");
		}
	}
});

Но в каждой бочке меда есть ложка PHP поэтому в ответ мы всегда получаем 200 OK и JSON из которого надо понять что произошло


{
	status: {
		code: 401,
		message: "Unauthorized"
	},
	data: {}
}

Ясен пень, что писать каждый раз if с обработкой ошибок нам не интересно


$.ajax({
	url: "/",
	success: function(response) {
		if (response.status.code != 200) {
			processData(response.data);
		} else {
			showErrorMessage(response.status.message);
		}
	}
});

Поэтому надо перехватывать ответы на все запросы и обрабатывать их до вызова callback метода более того подменять вызов success на error если приходит статус отличный от 200. Поскольку AJAX запрос это Deferred, то нам надо его поймать и разрезолвить, чем и займемся.


jQuery.ajaxPrefilter("json", function (options, originalOptions, jqXHR) {
	var originalPromise = jqXHR.promise(),
		newDeferred = $.Deferred(function (deferred) {
			deferred.promise(jqXHR);
			jqXHR.success = deferred.done;
			jqXHR.error = deferred.fail;
		});
	originalPromise.done(function (response) {
		if (response.state.code == 200) {
			newDeferred.resolve(response.data);
		} else {
			newDeferred.reject();
			console.log(response.status.message);
		}
	});
});

10 Комментарии “Обработка статусов сервера

  1. Что мешает пхпшкой отдавать корректные статусы?

  2. В PHP статусы в заголовках делать легко, но нужно знать протокол HTTP
    А вот «ложка PHP» заключается в низком качестве адептов.
    На моем веку практически не встречались мастера этого кунгфу (уверен они есть).
    P.S. Себя PHP-программистом не считаю ;)

  3. зачем писать хорошо, если можно быстро ((( мои взяли yii и наплодили на нем то что описано

  4. Короче все как всегда. Сначала какие-то чуваки понаписывали хуйни, а потом пхп виноват. На руби такого конечно быть не может, ага.

  5. каким то волшебным образом оба проекта на рублях в моей конторе к которым я приложил руку были охуенны) а прошлый проект на пхп был отпидарашен лично мной и я очень надеюсь что он был последний на пхп

Комментарии закрыты