Kendo自动填充授权标题

时间:2015-11-18 20:28:26

标签: jquery ajax kendo-ui

我无法弄清楚为什么我的Kendo自动填充小部件没有将请求中的授权标头发送到服务器:

var dataSource = new kendo.data.DataSource({
    type: 'odata',
    serverFiltering: true,
    transport: {
        read: {
            url: myApiUrl,
            type: 'GET',
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', myAuthorizationValue);
            }
        }
    }
});

$('#myAutocompleteField').kendoAutoComplete({
    dataTextField: 'fieldName',
    filter: 'contains',
    minLength: 3,
    dataSource: dataSource
});

当我在开发工具中检查服务器响应时,我从服务器收到401 Unauthorized错误。查看请求标头,我根本看不到Authorization属性。

我需要做什么才能将Authorization标头包含在请求中?

更新

我继续探索这个问题。如果我只是在Kendo DataSource参数中使用与$.ajax相同的对象执行典型transport.read请求,则会发送标头并获得成功响应。

$.ajax({
    url: myApiUrl,
    type: 'GET',
    beforeSend: function (xhr) {
        xhr.setRequestHeader('Authorization', myAuthorizationValue);
    },
    success: function(res) {
        console.log('success!');
        console.log(res);
    }
});

1 个答案:

答案 0 :(得分:1)

根据this forum post on Telerik forum,当使用type: 'odata'时,服务器希望使用JSONP并且不会发送Auth标头。

注释掉该行,如下所示,将发送Auth标头,但它使用过滤器数组发送搜索到的查询,而不是典型的ODATA参数(这是有意义的):

var dataSource = new kendo.data.DataSource({
    //type: 'odata',  // this causes the auth headers to not be sent
    serverFiltering: true,
    transport: {
        read: {
            url: myApiUrl,
            type: 'GET',
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', myAuthorizationValue);
            }
        }
    }
});

// Parameters sent
filter[filters][0][value]:sprint
filter[filters][0][operator]:contains
filter[filters][0][field]:fieldName
filter[filters][0][ignoreCase]:true
filter[logic]:and

有趣的是,我在互联网的其他地方发现有人使用type: 'odata-v4',它发送了Auth标头并正确发送了ODATA过滤器参数。

var dataSource = new kendo.data.DataSource({
    type: 'odata-v4',
    serverFiltering: true,
    transport: {
        read: {
            url: myApiUrl,
            type: 'GET',
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', myAuthorizationValue);
            }
        }
    }
});

// Parameters Sent
$format:json
$filter:contains(tolower(fieldName),'sprin') // sprin is the search string
$count:true