Yelp API和AngularJS

时间:2014-05-17 21:30:57

标签: angularjs jsonp yelp

我正在尝试使用AngularJS调用Yelp API,但我遇到了麻烦。我一直收到400个不好的请求,我不知道为什么。

Yelp API文档:

http://www.yelp.com/developers/documentation/v2/authentication http://www.yelp.com/developers/documentation/v2/search_api

包含Yelp API生成密钥的页面:

http://gyazo.com/fa918329eb0cde18a5db242d1d0b0b0e

这是我的代码执行调用的片段:

function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
return result;
}

app.factory("MyYelpAPI", function($http) {
return {
    "retrieveYelp": function(name, callback) {
        $http.jsonp("http://api.yelp.com/v2/search?term=food&location=San+Francisco&callback=JSON_CALLBACK",
            {
                params: {
                    oauth_consumer_key: /* Consumer Key */,
                    oauth_token: /* Token */,
                    oauth_signature_method: "hmac-sha1",
                    oauth_signature: /* Token Secret */,
                    oauth_timestamp: new Date().getTime(),
                    oauth_nonce: randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
                }
            }
        ).success(callback);
    }
}
});

1 个答案:

答案 0 :(得分:7)

Yelp API会在响应正文中找到非常有用的错误消息。我已经做了3个步骤来提出请求:

  1. 更改" hmac-sha1"到" HMAC-SHA1"。文档说hmac-sha1但它错了。

  2. oauth_signature与Token Secret不同。您需要分别为每个请求生成oauth_signature。我使用了这个库https://github.com/bettiolo/oauth-signature-js

  3. AngularJS向服务器发送硬编码回调参数,因此我们也需要在参数列表中对其进行硬编码。否则我们的签名不正确。

  4. 我的代码:

    
    
    <!doctype html>
    <html>
        <head>
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.js"></script>
            <script src="https://raw.githubusercontent.com/bettiolo/oauth-signature-js/master/dist/oauth-signature.min.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 = [];
                    MyYelpAPI.retrieveYelp('', function(data) {
                        $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+Francisc',
                                    oauth_consumer_key: '', //Consumer Key
                                    oauth_token: '', //Token
                                    oauth_signature_method: "HMAC-SHA1",
                                    oauth_timestamp: new Date().getTime(),
                                    oauth_nonce: randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
                                    term: 'food'
                                };
                            var consumerSecret = ''; //Consumer Secret
                            var tokenSecret = ''; //Token Secret
                            var signature = oauthSignature.generate(method, url, params, consumerSecret, tokenSecret, { encodeSignature: false});
                            params['oauth_signature'] = signature;
                            $http.jsonp(url, {params: params}).success(callback);
                        }
                    }
                });
            </script>
        </body>
    </html>
    &#13;
    &#13;
    &#13;