我无法弄清楚为什么我的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);
}
});
答案 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