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 правильно

Другие вопросы по тегам