使用DotNetOpenAuth访问Yelp的OAuth 1.0a API [英] Accessing Yelp's OAuth 1.0a API with DotNetOpenAuth

查看:71
本文介绍了使用DotNetOpenAuth访问Yelp的OAuth 1.0a API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人使用DotNetOpenAuth成功使用DotNetOpenAuth来访问 Yelp的v2 api 吗?

Has anyone had success using DotNetOpenAuth to access Yelp's v2 api using DotNetOpenAuth?

在仔细阅读示例和源代码之后,我得出了以下结论:

After digging through the examples and the source, this is what I came up with:

public class YelpConnector
{               
    private static readonly string YelpConsumerKey = ConfigurationManager.AppSettings["YelpConsumerKey"];
    private static readonly string YelpConsumerSecret = ConfigurationManager.AppSettings["YelpConsumerSecret"];
    private static readonly string YelpToken = ConfigurationManager.AppSettings["YelpToken"];
    private static readonly string YelpTokenSecret = ConfigurationManager.AppSettings["YelpTokenSecret"];
    private static readonly InMemoryTokenManager tokenManager = new InMemoryTokenManager(YelpConsumerKey, YelpConsumerSecret, YelpToken, YelpTokenSecret);
    private static readonly Uri YelpURLBase = new Uri("http://api.yelp.com/v2/");        
    private static readonly ServiceProviderDescription YelpServiceDescription = new ServiceProviderDescription {
        RequestTokenEndpoint = null,
        UserAuthorizationEndpoint = null,
        AccessTokenEndpoint = null,
        TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() },
    };

    private static dynamic SearchBase(string queryString)
    {
        if (string.IsNullOrEmpty(queryString))
            throw new ArgumentNullException();
        var searchEndpoint = new MessageReceivingEndpoint(new Uri(YelpURLBase, "search?" + queryString), HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest);
        var consumer = new WebConsumer(YelpServiceDescription, tokenManager);
        try
        {
            using (IncomingWebResponse response = consumer.PrepareAuthorizedRequestAndSend(searchEndpoint, YelpToken))
            {
                string rs = response.GetResponseReader().ReadToEnd();
                dynamic js = SimpleJson.SimpleJson.DeserializeObject(rs);
                return js;
            }
        }
        catch (Exception e)
        {
            ErrorSignal.FromCurrentContext().Raise(e);
            return null;
        }            
    }
    internal class InMemoryTokenManager : IConsumerTokenManager
    {
        private Dictionary<string, string> tokensAndSecrets = new Dictionary<string, string>();

        public InMemoryTokenManager(string consumerKey, string consumerSecret, string token, string secret)
        {
            if (String.IsNullOrEmpty(consumerKey))
            {
                throw new ArgumentNullException("consumerKey");
            }
            this.tokensAndSecrets[token] = secret;
            this.ConsumerKey = consumerKey;
            this.ConsumerSecret = consumerSecret;
        }

        public string ConsumerKey { get; private set; }

        public string ConsumerSecret { get; private set; }

        public string GetTokenSecret(string token)
        {
            return this.tokensAndSecrets[token];
        }

        public void StoreNewRequestToken(UnauthorizedTokenRequest request, ITokenSecretContainingMessage response)
        {
            this.tokensAndSecrets[response.Token] = response.TokenSecret;
        }

        public void ExpireRequestTokenAndStoreNewAccessToken(string consumerKey, string requestToken, string accessToken, string accessTokenSecret)
        {
            this.tokensAndSecrets.Remove(requestToken);
            this.tokensAndSecrets[accessToken] = accessTokenSecret;
        }

        public TokenType GetTokenType(string token)
        {
            throw new NotImplementedException();
        }           
    }
 }

如果我通过以下内容QueryString limit = 5& category_filter = movietheaters,bars,cafe,museums,danceclubs,parks≪ == 37.78364455,-122.464104 ,我收到一个异常消息:前提条件失败:值!= null,并且堆栈跟踪为:

If I pass in the following QueryString limit=5&category_filter=movietheaters,bars,cafe,museums,danceclubs,parks&ll=37.78364455,-122.464104, I get an exception saying "Precondition failed.: value != null" and a stacktrace of:

at System.Diagnostics.Contracts.__ContractsRuntime.Requires[TException](Boolean condition, String message, String conditionText)
at DotNetOpenAuth.Messaging.MessagingUtilities.EscapeUriDataStringRfc3986(String value)
at DotNetOpenAuth.OAuth.ChannelElements.SigningBindingElementBase.ConstructSignatureBaseString(ITamperResistantOAuthMessage message, MessageDictionary messageDictionary)
at DotNetOpenAuth.OAuth.ChannelElements.HmacSha1SigningBindingElement.GetSignature(ITamperResistantOAuthMessage message)
at DotNetOpenAuth.OAuth.ChannelElements.SigningBindingElementBase.ProcessOutgoingMessage(IProtocolMessage message)
at DotNetOpenAuth.OAuth.ChannelElements.SigningBindingElementChain.ProcessOutgoingMessage(IProtocolMessage message)
at DotNetOpenAuth.Messaging.Channel.ProcessOutgoingMessage(IProtocolMessage message)
at DotNetOpenAuth.OAuth.ChannelElements.OAuthChannel.InitializeRequest(IDirectedProtocolMessage request)
at DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequestAndSend(MessageReceivingEndpoint endpoint, String accessToken)
at MeetPpl.Helpers.SocialConnectors.YelpConnector.SearchBase(String queryString)

有什么建议吗?我是在正确的道路上吗?

Any suggestions? Am I on the right trail?

推荐答案

在放弃dotnetopenauth之前,我整整一天都在苦苦挣扎。我发现了一种非常简单的方法,可以使用 http://www.twitterizer.net/ 的oauth库搜索yelp。 。只需下载twitterizer的精简版并在下面使用我的示例代码即可。

I struggled with this issue for 1 whole day before giving up on dotnetopenauth. I found a very simple way to search yelp using the oauth library of http://www.twitterizer.net/ . Simply download the lite version of twitterizer and use my sample code below.

下载链接为 http://www.twitterizer.net/files/Twitterizer2lite-2.3.2.zip

    public static string search()
    {
        string yelpSearchURL = "http://api.yelp.com/v2/search?term=food&location=San+Francisco";
        string yelpConsumerKey = "your key";
        string yelpConsumerSecret = "your secret";
        string yelpRequestToken = "your token";
        string yelpRequestTokenSecret = "your token secret";

        Twitterizer.OAuthTokens ot = new Twitterizer.OAuthTokens();
        ot.AccessToken = yelpRequestToken;
        ot.AccessTokenSecret = yelpRequestTokenSecret;
        ot.ConsumerKey = yelpConsumerKey;
        ot.ConsumerSecret = yelpConsumerSecret;

        string formattedUri = String.Format(CultureInfo.InvariantCulture,
                             yelpSearchURL, "");
        Uri url = new Uri(formattedUri);
        Twitterizer.WebRequestBuilder wb = new Twitterizer.WebRequestBuilder(url, Twitterizer.HTTPVerb.GET, ot);
        System.Net.HttpWebResponse wr = wb.ExecuteRequest();
        StreamReader sr = new StreamReader(wr.GetResponseStream());
        return sr.ReadToEnd();
    }

这篇关于使用DotNetOpenAuth访问Yelp的OAuth 1.0a API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆