Последующие запросы JSONP дают статус 404, несмотря на статус GET 200

Таким образом, я могу заставить работать первый JSONP-запрос к yelp API, чтобы вернуть мне бизнес-данные, но любые последующие запросы, которые я делаю, приводят к обратному вызову для сбоя, который регистрирует код состояния 404. Тем не менее, когда я открываю вкладку сети в Chrome Dev Tools я вижу, что все последующие запросы GET, которые я сделал, имеют статус 200, и я вижу действительные данные ответа. Как такое может быть, когда был вызван обратный вызов при ошибке? Как я могу это исправить? Я бы хотел получать данные более одного раза.

Следующий рассматриваемый код основан на ответе на этот другой вопрос Yelp API и AngularJS, разница заключается в утверждениях непосредственно под комментариями

<!DOCTYPE html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
    <script src="oauth-signature.js"></script>
</head>
<body ng-app="plunker">
    <div  ng-controller="MainCtrl">
        <p><date-input name="info.name" message="info.message"></date-input></p>
        <ul>
            <li data-ng-repeat="business in businesses">
                {{business.name}}
            </li>
        </ul>
    </div>
    <script>
        function randomString(length, chars) {
            var result = '';
            for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
            return result;
        }

        var app = angular.module('plunker', []);
        app.controller('MainCtrl', ['$scope', 'MyYelpAPI', function($scope, MyYelpAPI) {
            $scope.businesses = [];

            // first time for the callback gets executed
            MyYelpAPI.retrieveYelp('', function(data) {
                console.log('callback1');
                console.log('data');
                $scope.businesses = data.businesses;
            });

            // the second time for the callback doesn't get executed
            MyYelpAPI.retrieveYelp('', function(data) {
                console.log('callback2');
                $scope.businesses = data.businesses;
            });

        }]).factory("MyYelpAPI", function($http) {
            return {
                "retrieveYelp": function(name, callback) {
                    var method = 'GET';
                    var url = 'http://api.yelp.com/v2/search';
                    var params = {
                            callback: 'angular.callbacks._0',
                            location: 'San+Francisco',
                            oauth_consumer_key: '', 
                            oauth_token: '', 
                            oauth_signature_method: "HMAC-SHA1",
                            oauth_timestamp: new Date().getTime(),
                            oauth_nonce: randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
                            term: 'food'
                        };
                    var consumerSecret = '',
                    var tokenSecret = '',
                    var signature = oauthSignature.generate(method, url, params, consumerSecret, tokenSecret, { encodeSignature: false});
                    params['oauth_signature'] = signature;
                    $http.jsonp(url, {params: params})
                        .success(callback)
                        // second time fails
                        // data -> undefined; status -> 404
                        .error(function(data, status) {
                            console.log(data, status); // why is this happening?
                        });
                }
            }
        });
    </script>
</body>
</html>

person Kevin Pamaran    schedule 09.09.2015    source источник
comment
Я думаю, тебе нужно сделать вот так $ http.jsonp (api.yelp.com/v2 / search? callback = JSON_CALLBACK, params) .success (function () {// успех}). error (function () {// отказ});   -  person Juned Lanja    schedule 09.09.2015
comment
Добавление параметра запроса обратного вызова к URL-адресу помогло. Спасибо!   -  person Kevin Pamaran    schedule 09.09.2015


Ответы (1)


Делать это нужно так:

$http.jsonp("api.yelp.com/v2/search?callback=JSON_CALLBACK", yourParams) 
.success(function() {
     //success callback
})
.error(function(){
     //error callback
}) ;
person Juned Lanja    schedule 09.09.2015