@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?
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 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, перед проверкой удаляйте лишние слеши. И если он валиден, то делайте с ним дальше что хотите, тогда не придется писать две ошибки вместо одной.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 14:52
100000 руб./за проект
03 мая 2024, в 14:40
1000 руб./за проект