Прошу помощи зала в выборе архитектуры приложения.
Чего хочется: JSON API.
Есть два типа запросов:
1. параметризированные, результат которых — массивы структурированных данных (как бы чтение)
2. принимающие структурированные данные (как бы запись)
Хочется как-то унифицировать, т.е. не хотелось бы делать разные способы передачи данных (скажем для первого варианта — это параметры URI, а для второго — JSON POST). Т.е. хотелось бы, чтобы оба типа запросов принимались как JSON POST. Так и понятнее и однообразнее.
Однако возникает проблема с кешированием. Запросы первого типа отдают данные, которые редко меняются. Хотелось бы не тащить их из базы, а кешировать. Ника не могу найти можно ли как-то кешировать JSON POST запросы скажем к nginx'у. Понятно, что запросы второго типа кешировать не надо.
Сейчас сделано так: всё отправляется JSON POST, принимается php, парстися JSON запрос, проверяются все параметры, определяется тип запроса, по параметрам создается хэш кэша, проверяется есть ли результаты в кэше, отдается кэш или запрашивается база. Хотелось бы обойтись как-то без участия php-fpm.
не совсем понятно зачем нужен имено JSON POST если все параметры умещаются в URI, то есть обьектов нет или сериализация примитивная. Я бы просто сделал GET и POST.
Единообразие GET и POST делать через $_REQUEST, ежели все таки JSON POST то просто $_GET поэлементно запизиваем в обьект, как если бы он был из JSON POST, и дальше его парсим.
Похоже про кэширование не совсем корректно написано в вопросе. nginx отлично кэширует GET, надо просто ключом поставить что то типа
proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
а POST как раз некэшируется и вроде как и не надо. Так что проблема вроде как решается автоматом.
JSON POST нужен для второго типа — там могут передаваться массивы структурированных данных.
С ключем кэша GET понятно, с POST не вижу решения.
Получается, что запросы чтения клиент будет делать типа api.site.com/action/?name=value&name2=value2
а запросы записи запрашивать api.site.com/other_action/ и отправлять туда JSON методом POST.
Вот от этого отличия хочется избавиться.
опять не понял проблемы. GET надо кэшировать, POST не надо. Совсем. И все будет хорошо. И для этого ничего не надо делать, поскольку nginx POST не кэширует.
Все что надо — это либо подобрать время жизни кэша, что бы данные были валидны это время, либо через proxy_bypass скидывать кэш для обновленных запросов GET.
Это все позволяет имхо иметь одну точку доступа /action или как там хочется.