Кэш приложения HTML5 не работает с запросами POST - PullRequest
5 голосов
/ 20 октября 2010

Я работаю над веб-приложением и прошел все необходимые шаги, чтобы включить кэш приложения HTML5 для моей начальной страницы входа.Моя цель - кэшировать все изображения, CSS и JS, чтобы повысить производительность при просмотре в Интернете, я не планирую просматривать в автономном режиме.

Моя начальная страница состоит из формы входа в систему с одним тегом ввода для ввода имени пользователя и кнопкой отправки для обработки информации в виде запроса POST.Отправленная информация проверяется на сервере, и если возникает проблема, снова отображается начальная страница (это сценарий, который я сейчас тестирую)

Я использую инструменты разработчика браузера для отладки, и все работаетштраф за первоначальный запрос (запрос GET, введя URL в браузере);ресурсы, перечисленные в файле манифеста, должным образом кэшируются, но когда эта же страница снова отображается в результате запроса POST, я замечаю, что все ранее кэшированные элементы (изображения, css, js) извлекаются с сервера снова,

Означает ли это, что кэш приложений HTML5 работает только для запросов GET?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2011

За http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#the-application-cache-selection-algorithm мне кажется, что разрешен только GET.

В современных браузерах (которые поддерживают автономный HTML) GET-запросы, вероятно, могут выполняться достаточно долго, чтобы предоставить необходимые данные для возврата нужных вам данных, и POST-запросы не должны использоваться для запросов, которые являются идемпотентными(не меняется).Таким образом, приложение, вероятно, должно быть спроектировано так, чтобы разрешать запросы GET, если это тот тип данных, который полезен в автономном режиме, и информировать пользователя о том, что ему нужно будет войти в систему, чтобы получить контент, отправленный ему для полного автономного использования (и выможет использовать автономные события, чтобы сообщить им, что они еще не прошли необходимый процесс).

1 голос
/ 22 февраля 2014

У меня точно такая же проблема, и я написал оболочку для вызовов POST ajax. Идея состоит в том, что когда вы пытаетесь выполнить POST, он сначала делает GET-запрос к простому ping.php, и только в случае успеха он запрашивает POST.

Вот как это выглядит в режиме Backbone:

var BaseView = Backbone.View.extend({
    ajax: function(options){
        var that = this,
        originalPost = null;

        // defaults
        options.type = options.type || 'POST';
        options.dataType = options.dataType || 'json';

        if(!options.forcePost && options.type.toUpperCase()==='POST'){
            originalPost = {
                url: options.url,
                data: options.data
            }; 
            options.type = 'GET';
            options.url = 'ping.php';
            options.data = null;
        }

        // wrap success
        var success = options.success;
        options.success = function(resp){

            if(resp && resp._noNetwork){
                if(options.offline){
                    options.offline();
                }else{
                    alert('No network connection');
                }
                return;
            }

            if(originalPost){
                options.url = originalPost.url;
                options.data = originalPost.data;
                options.type = 'POST';
                options.success = success;
                options.forcePost = true;
                that.ajax(options);
            }else{
                if(success){
                    success(resp);
                }
            }


        };

        $.ajax(options);
    }
});


var MyView = BaseView.extend({
    myMethod: function(){
        this.ajax({
            url: 'register.php',
            type: 'POST',
            data: {
                'username': 'sample',
                'email': 'sample@sample.com'
            },
            success: function(){
                alert('You registered :)')
            },
            offline: function(){
                alert('Sorry, you can not register while offline :(');
            }
        });
    }
});

Имейте что-то вроде этого в вашем манифесте:

NETWORK:
*

FALLBACK:
ping.php no-network.json
register.php no-network.json

Файл ping.php так же прост, как:

<?php die('{}') ?>

И no-network.json выглядит так:

{"_noNetwork":true}

И все, перед любым POST он сначала попробует GET ping.php и вызовет offline (), если вы не в сети.

Надеюсь, это поможет;)

...