2015-05-13 3 views
0

Я попытался кэшировать ответ json из запроса api с помощью Etag. я звоню что-то вроде этого http://localhost:3000/api/config и получение:Кэш браузера: ответ Json

Response Headers:
Cache-Control: общественность, макс возраста = 31557600
соединения: держать-жив
Content-Length: 11
Content-Type: применение/JSON; кодировка = UTF-8
Дата: Ср, 13 мая 2015 11:41:52 GMT
ETag: "94d52736bcd99b1ac771f13b1bbdf622"
X-Powered-By: Экспресс

Resonse: {ID: 1}

Я ожидал, что браузер будет кэшировать ответ и отправить Etag с помощью следующего триггера запроса на «f5». Но это не так.

Заголовки запросов второго запроса:
Accept: Текст/HTML, приложение/XHTML + XML, приложение/XML; д = 0,9, образ/WebP, /; д = 0,8
Accept-Encoding: GZIP, выкачать, SDCH
не Accept-Language: де-DE, де, Q = 0.8, EN-US; д = 0,6, ан; д = 0,4
Cache-Control: нет-кэша
Connection: Keep-жив
Хост: localhost: 3000
Pragma: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, например, Gecko) Chrome/42.0.2311.135 Safari/537.36

Невозможно ли кэшировать чистый ответ json, получая прямые запросы api?
Или мне что-то не хватает.

API-интерфейс является узлом тест implemantation расслоение плотной сделано с экспресс:

router.get('/config', function(req, res) { 
    var eTag = crypto.createHash('md5').update(JSON.stringify(config)).digest('hex'); 
    res.setHeader('ETag', '"' + eTag + '"'); 
    res.setHeader('Content-Type', 'application/json'); 
    res.setHeader('Cache-Control', 'public, max-age=31557600'); 
}); 

Testet с Chrom (42.x) и светлячок (37.x)

Thx для ответа.

+0

Да, вы можете кэшировать ответы в формате JSON. На первый взгляд это похоже на проблему с браузером. Вы не должны отправлять «прагма: no-cache» в заголовки запроса, если вы не отключили кеш в хром-отладчике или в других настройках вашего браузера. Как вы выдаете этот запрос? –

+0

Я просто вызываю маршрут api, используя браузер url bar. Я также попытался вызвать маршрут, используя тег скрипта, например , возвращающий объект javascript var config = {...}. –

+0

Я читал, что это должно быть возможно с помощью запроса ajax, но мне нужен прямой вызов. –

ответ

0

Похоже, вы используете хром. Chrome должен включать следующий заголовок в запросе после «f5»:

If-None-Match:"94d52736bcd99b1ac771f13b1bbdf622" 

Если вы не видите этого, проверьте настройки хром/Общие и убедитесь, что «Отключить кэш (в то время как DevTools открыт) является не проверено:

Disable cache not checked in Chrome dev tools

+0

Отключить кеш (пока DevTools открыт) не проверяется. –

+0

@LukasBonzelett, какую библиотеку вы используете для вызова API? JQuery? – goofballLogic

+0

Я делаю прямой вызов его без вызова ajax. –

0

Использование JQuery мы можем использовать опцию ifModified:

$.ajax({ 
    type: "GET", 
    ifModified: true, 
    url: "http://localhost:3000/api/config" 
}).then(function(data) { 
    . . . 
}); 
1

Привет этот код, кажется, работает для меня:

router.get('/config', function(req, res) { 
    var eTag = crypto.createHash('md5').update(JSON.stringify(config)).digest('hex'); 

    if (req.headers['if-none-match'] && req.headers['if-none-match'] === '"' + eTag + '"') { 
     res.status(304); 
     res.end(); 
    } else { 
     res.setHeader('ETag', '"' + eTag + '"'); 
     res.setHeader('Content-Type', 'application/json'); 
     res.setHeader('Cache-Control', 'public, max-age=31557600'); 
     res.send(JSON.stringify(config)); 
    } 
}); 

Вызов API с помощью браузера адресной строке http://localhost:3000/api/config

+0

Вы должны использовать более старую версию express? Express обрабатывает etags для вас по умолчанию в более поздних версиях. Вам не нужен этот if-block. См. Здесь: http://expressjs.com/4x/api.html#app.set. – goofballLogic

+0

Использование выражения 4, я получаю заголовок 304, тип контента и etag, обратно: router.get ('/ config', function (req, res) { res.send (config); }); – goofballLogic

+0

Да, вы абсолютно правы. Я сам это понял. Я не знаю, почему это не сработало с самого начала. –

Смежные вопросы