Как я могу установить заголовок Accept для ссылки на веб-странице?

Это в основном вопрос о башне из слоновой кости, так как я могу просто просто создать новую конечную точку URL. Но в основном, я хотел бы иметь возможность обслуживать CSV, когда пользователь имеет заголовок Accept, настроенный для включения text/csv. Это тривиально на стороне сервера, но на стороне клиента я не знаю, как установить заголовок Accept, если я не использую XHR или какой-либо другой "не-браузер". Есть ли способ в HTML установить заголовок Accept в ссылке или в JS для установки заголовка Accept при использовании window.location?

Ответы

Ответ 1

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

Ответ 2

Update:

Я оставлю свой первоначальный ответ ниже для потомков, но теперь я вижу, что я действительно не отвечал на вопрос. Невозможно сделать это "изначально", лучший подход, который я могу придумать, - использовать данные uri (http://en.wikipedia.org/wiki/Data_URI_scheme) и попросите AJAX выполнить для вас работу:

// aware that you didn't mention jQuery, but you can do this with or without
var download = function(){
    var mime = this.getAttribute('data-mime-type');
    $.ajax({
        accepts: mime,
        success: function(data){
            var uri = 'data:'+mime+';charset=UTF-8,' + encodeURIComponent(data);
            window.location = uri;
        }
    })
    return false;
}

С той же идеей, что и в примере ниже:

<a href="/some-csv-endpoint" data-mime-type="text/csv">Download CSV</a>

document.querySelectorAll('a[data-mime-type]').onclick = download;


Оригинальный ответ

Нет встроенного способа заставить заголовок "Принять" по ссылке (через HTML или Javascript). Я думаю, вы могли бы легко снять это с помощью очень небольшого количества серверных и клиентских кодов. Должно быть легко на любом языке, мой пример - PHP:

function get_accepted_headers() {
    $headers = apache_request_headers();
    if(array_key_exists('Accept', $headers)) {
        $accepted = explode(',', $headers['Accept']);
        return $accepted;
    }
    return array();
}

Добавьте атрибут приема данных в ссылки для загрузки:

<a href="/some-csv-file.csv" data-accept="text/csv">Download CSV</a>

Затем присоедините обработчик события клика, чтобы убедиться, что пользователь принимает указанный тип содержимого:

// will end up with something like: ["text/html", "application/xhtml+xml", "application/xml;q=0.9", "image/webp", "*/*;q=0.8"]
var user_headers = <?=stripslashes(json_encode(get_accepted_headers()))?>;
var click_header_check = function() {
    var accept = this.getAttribute('data-accept');
    if(user_headers.indexOf(accept) == -1) {
        console.log('User does not explicitly accept content-type: %s', accept);
        return false;
    }
    window.location = this.href;
    return;
}

// attach the event listener
document.querySelector('a[data-accept]').onclick = click_header_check;

Не уверен, что это то, что вы искали, но надеюсь, что это поможет.

Ответ 3

Для тех, кто еще заинтересован, есть способ сделать это в чистом javascript.

В следующем коде используется JQuery (https://jquery.com/) и FileSaver.js(http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js), хотя вы можете сами написать соответствующие части:

//in case of non binary data use:
var type = 'text/xml';
var url = 'http://your_url_here/'
$.ajax({accepts:{text:type},
        url:url,
        processData:false, 
        dataType:'text', 
        success:function(data){             
                saveAs(new Blob([data], {type: type}),'filename.txt');                                                                  
            }, 
        error: function(){
               // Handle errors here
            }
    });