2015-11-18 3 views
1

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

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.

Что мне нужно сделать, чтобы заголовок авторизации был включен в запрос?

Update:

Я продолжал исследовать эту проблему. Если я просто делаю типичный запрос $.ajax с тем же объектом, что и transport.read в параметре Kendo DataSource, он отправляет заголовки, и я получаю успешный ответ.

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

ответ

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 
Смежные вопросы