2017-01-18 17 views
4

Я изо всех сил пытаюсь написать код, который надежно выполнит запрос POST при закрытии окна вкладок. Navigator.sendBeacon, кажется, именно то, что мне нужно (я только требую, чтобы это работало для Google Chrome).Вызвать запрос POST для регистрации из окна разгрузки

$(global).bind('unload', function() { 
    let body = { 
    UserEmail: appState.user.email, 
    Job: { 
     Id: appState.jobId 
    }, 
    Timestamp: '/Date(' + new Date().getTime() + ')/', 
    EventOrigin: 'PdfReviewClient', 
    Event: 'JobClosed' 
    }; 
    let headers = { 
    Authorization: `JWT ${authenticationState.token}`, 
    'Content-Type': 'application/json; charset=utf8' 
    }; 
    let blob = new Blob([JSON.stringify(body)], headers); 
    navigator.sendBeacon(configuration.rootApiUrl + 'jobevents', blob); 
}); 

Мой маяк включает пользовательские заголовки, поэтому я создаю Blob.

Однако этот запрос, похоже, не происходит. Это особенно сложно отладить, поскольку окно закрывается. Итак, вопрос в том, почему мой маяк не отправляется?

+0

Я предполагаю, что вы подтвердили, что запрос происходит, когда * не * сделано в браузере закрыто? – Jorg

+0

@Jorg Да, у меня есть. Хорошая мысль, спасибо за проверку, но это не проблема в этом случае. –

+0

И выгрузка сама запускает тоже? Возможно, вы сможете протестировать его с помощью «предупреждения», чтобы увидеть, закрывает ли окно окно – Jorg

ответ

3

Вопрос был только заголовок вы можете установить с navigator.sendBeacon является Content-Type, и вы установили, что установив type в настройках Blob. Маршрут сервера должен был быть изменен для удовлетворения запроса без заголовка авторизации (я передал его как параметр URL вместо этого - странно для запроса POST, но, по-видимому, единственный способ сделать это с маяком). Вот как это выглядело в конце концов:

$(global).bind('unload', function() { 
    if(appState.jobId == null) return; 

    let headers = { 
    type: 'application/json' 
    }; 

    let jobEventLoggingBody = { 
    UserEmail: appState.user.email, 
    Job: { 
     Id: appState.jobId 
    }, 
    Timestamp: '/Date(' + new Date().getTime() + ')/', 
    EventOrigin: 'PdfReviewClient', 
    Event: 'JobClosed' 
    }; 
    let jobEventLoggingUrl = `${configuration.rootApiUrl}jobevents?jwt=${authenticationState.token}`; 
    let jobEventLoggingBlob = new Blob([JSON.stringify(jobEventLoggingBody)], headers); 
    navigator.sendBeacon(jobEventLoggingUrl, jobEventLoggingBlob); 
}); 

Смотрите также this question, которые специфически адреса отправки заголовков в маяках.

+0

Я столкнулся с той же проблемой - мне просто нужно было отправить данные в виде строки запроса. Спасибо за q + a. Кто-нибудь знает, почему это так (поскольку обычно строка запроса используется для GET, и поскольку sendBeacon является POST-запросом, я ожидал, что значения, которые я отправляю, будут в теле). – xenetics

0

Я не знаю, может ли это вам помочь. Вы можете использовать это для отладки.

function logData() { 
    var newWindow = window.open(); 
    newWindow.document.write("ohai"); 
} 

window.addEventListener("unload", logData, false);