jsonp получает 404 при вызове Redmine API
Я пытаюсь использовать Redmine API из проекта angularjs.
Я решил использовать jsonp для решения проблемы CORS.
Я получаю 404 при вызове этого:
var url = 'http://muser:mpasswd@myredmine/issues.json?callback=displayIssues';
$http({
method: 'JSONP',
url: url
}).
success(function (data, status) {
console.log("success");
console.log(data);
}).
error(function (data, status) {
console.log("Error: " + status);
});
...
function displayIssues(issues) {
console.log('displayIssues');
...
}
Но когда я звоню по тому же адресу с Почтальоном, это работает.
Почему я получаю эти 404?
вот моя консоль:
GET http://muser:mpasswd@myredmine/issues.json?callback=displayIssues jsonpReq @ angular.js:8576(anonymous function) @ angular.js:8420sendReq @ angular.js:8291serverRequest @ angular.js:8025wrappedCallback @ angular.js:11498wrappedCallback @ angular.js:11498(anonymous function) @ angular.js:11584Scope.$eval @ angular.js:12608Scope.$digest @ angular.js:12420Scope.$apply @ angular.js:12712(anonymous function) @ angular.js:18980x.event.dispatch @ jquery-2.0.3.min.js:5y.handle @ jquery-2.0.3.min.js:5
authentication.service.js:100 Error: 404
Rest API и jsonp включены в admin->setting->auth
Я также попробовал:
var url = 'http://muser:mpasswd@myredmine/redmine/issues.json&callback=JSON_CALLBACK';
$http.jsonp(url, {
params: {
callback: 'JSON_CALLBACK',
format: 'json'
}
}).success(function (data) {
console.log('ok');
}).error(function (data) {
console.log('error: ' + JSON.stringify(data));
});
получить это:
GET http://muser:mpasswd@myredmine/issues.json&callback=angular.callbacks._0?callback=JSON_CALLBACK&format=json jsonpReq @ angular.js:8576(anonymous function) @ angular.js:8420sendReq @ angular.js:8291serverRequest @ angular.js:8025wrappedCallback @ angular.js:11498wrappedCallback @ angular.js:11498(anonymous function) @ angular.js:11584Scope.$eval @ angular.js:12608Scope.$digest @ angular.js:12420Scope.$apply @ angular.js:12712(anonymous function) @ angular.js:18980x.event.dispatch @ jquery-2.0.3.min.js:5y.handle @ jquery-2.0.3.min.js:5
services.js:35 error: undefined
Также при звонке это:
var url = 'http://muser:mpasswd@myredmine/redmine/issues.json&callback=JSON_CALLBACK';
$http.jsonp(url).success(function (data) {
console.log('success');
}).error(function (error) {
console.log('error:: ' + error);
});
Я получаю ту же ошибку
Пожалуйста, учтите, что muser, mpasswd и myredmine - только примеры.
2 ответа
Из ngDocs:
Имя обратного вызова должно быть строкой JSON_CALLBACK
Angular заменит эту строку внутри angular.callbacks_{0-9a-z}
Итак, сначала измените свой код на это:
var url = 'http://muser:mpasswd@myredmine/redmine/issues.json?callback=JSON_CALLBACK';
$http.jsonp(url).succe...
Играя с этой скрипкой, кажется, что Redmine снимает точку .
из URL, таким образом делая angular.callbacks_0
в angularcallback_0
который не определен.
Вы можете прочитать больше на GitHub, есть проблема по этому поводу.
ВОЗМОЖНЫЕ РЕШЕНИЯ
1) Существует другой взлом, опубликованный другим пользователем на SO здесь, чтобы изменить имя обратного вызова на пользовательское.
Рабочая скрипка в соответствии с хаком @ Тоди-Адиатмо.
2) Другое решение в соответствии с @dancras, найденное по проблеме, опубликованной на github, заключается в определении неопределенного angularcallbacks_{..}
с призывом к angular.callbacks_{..}
а затем удалить глобальный angularcallbacks_
,
Вы должны использовать это непосредственно перед вызовом jsonp:
var c = $window.angular.callbacks.counter.toString(36);
$window['angularcallbacks_' + c] = function (data) {
$window.angular.callbacks['_' + c](data);
delete $window['angularcallbacks_' + c];
};
Рабочая скрипка в соответствии с решением @danca.
Я вижу, что ваша консоль показывает это: -
GET http://muser:mpasswd@myredmine/issues.json?callback=displayIssues
Технически это неверный URL в HTTP. Имя пользователя и пароль не должны быть в вызове GET, они должны быть в заголовке, в соответствии с.
https://en.wikipedia.org/wiki/Basic_access_authentication
Быстрый поиск в Google нашел эти https://docs.angularjs.org/api/ng/service/$ http и angularjs заголовки базовой аутентификации
Я годами не смотрел на redmine, и он мог нормально обрабатывать хитрый HTTP просто с опциями, указанными в предыдущих ответах, но если это не сработает, проверьте, действительно ли запрос попадает в Redmine правильно