Я построил API-интерфейс GraphQL поверх Firebase. API использует облачную функцию, связанную с Firebase Hosting, для обработки запросов.
Моя цель - кэшировать ответ для запросов, отправленных в API GraphQL.
Средство промежуточного ПО ExpressJS настроено следующим образом:
function setCacheHeaders(req, res, next) {
res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
return next();
}
Если я отправлю запрос GET API, я вижу, что он нажимает на CDN:
X-Cache: HIT
X-Cache-Hits: 1
X-Served-By: cache-lhr6343-LHR
Однако, когда я отправляю запрос POST (который является обычным способом взаимодействия с конечной точкой GraphQL, даже если это операция только для чтения), я замечаю, что никакие запросы не попадают в кеш. Однако ответ включает следующие заголовки:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 311
Content-Type: application/json
Date: Thu, 27 Jul 2017 05:41:02 GMT
Server: nginx
Strict-Transport-Security: max-age=31556926
Vary: Accept-Encoding, Authorization, Cookie
Via: 1.1 varnish
X-Cache: MISS
X-Cache-Hits: 0
X-Served-By: cache-lcy1133-LCY
X-Timer: S1501134062.745716,VS0,VE640
cache-control: public, max-age=300, s-maxage=600
function-execution-id: xg0qjlghrtrv
x-cloud-trace-context: 02434a5f73159e24d949e74026bb8843, 02434a5f73159e24d949e74026bb8843
x-powered-by: Express
Невозможно ли кэшировать ответ на запрос POST с помощью Firebase Hosting?
Нет. POST не является идемпотентным, и поскольку вы не получаете доступ к правилам лака Fastly (Firebase Hosting CDN provider), вы даже не можете "взломать" его.
Firebase Hosting не кэширует ответы POST.
Я не эксперт GraphQL, но насколько я вижу, они позволяют использовать GET для не мутирующих запросов. Хотя вам потребуется изменить код, он позволит вам кэшировать ответ.