@accountnujen

Как выходить из ситуации, когда 2 действия возвращают один результат?

Требование api одного сервиса, чтобы я мог отобразить json своей страницы с таким видом:
website.com/json?url=website.com/data/hash
где website.com/data/hash - ссылку, которую нужно отобразить в виде json.
Я беру GET запрос и достаю нужную часть из сслки (path):
$url = parse_url($_GET['url'])['path']
Я точно знаю, что path - /data/hash - содержит 2 слеша.
И чтобы достать хеш, я могу воспользоваться explode
$path = explode("/", $url);.

Валидный URL будет иметь массив из трёх значений^
0 - пустой
1 - data
2 - hash

Я не хочу лишний раз долбать базу, если пользователь сделал кривой запрос, к примеру:
website.com/json?url=website.com/data/hash/
website.com/json?url=website.com/data/hash///
website.com/json?url=website.com/data/hash/index.php

Поэтому я делаю такую конструкцию:
if (count($path) === 3) {
	# запрос в БД и обработка
} else {
	http_response_code(404);
	die();
}


Проблема заключается в том, что hash может быть сам по себе кривой (к примеру, пользователь неверно скопировал ссылку или запись удалена), поэтому внутри обработки я опять должен вывести ошибку 404

if (count($path) === 3) {
	# запрос в БД и обработка
	if ($result === true) { // если запись найдена
		#выводим результат
	} else {
		http_response_code(404);
		die();
	}
} else {
	http_response_code(404);
	die();
}


Меня напрягает двойное написание http_response_code(404); die();. Можно ли как-то избежать этого? Или это жертва за то, что я не хочу пускать к базе пользователей с неверным url?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 2
Immortal_pony
@Immortal_pony Куратор тега PHP
В первом случае должен быть код 400, а не 404.
Ну и код будет красивее (на мой взгляд) выглядеть, если эту проверку вынести в начало, избавившись от else-спагеттин c помощью концепта "early return":

// Валидируем 
if (count($path) !== 3) {
    http_response_code(400); //  вот тут 400, потому что это корявый запрос, мы даже ничего и не искали
    die();    
}

// Получаем данные 
$result  = getGesult();

// Валидируем данные 
if ($result !== true) { 
    http_response_code(404);
    die();    
}

// Дальше код, который выведет данные
Ответ написан
Комментировать
Newto
@Newto
Просто проверяйте формат входящего URLa, перед проверкой удаляйте лишние слеши. И если он валиден, то делайте с ним дальше что хотите, тогда не придется писать две ошибки вместо одной.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы