【问题标题】:500 px api with C# throwing 500 Internal Server Error500 px api 与 C# 抛出 500 内部服务器错误
【发布时间】:2015-11-07 03:51:43
【问题描述】:


我正在尝试用 C# 实现 500px API。我能够使用 500px API 对用户进行身份验证,但我无法获得 access_token 以换取 response_token,这使我的 Oauth 1.0 的第三步不完整。我能够授权用户并获得 oauth_tokenoauth_verifier 但是当我使用此 oauth_token 提出以下请求时:-

       https://api.500px.com/v1/oauth/access_token


500 Internal Server Error 以及以下屏幕被抛出

我已经调试了我的代码一千次,尝试了不同的方式来形成 URL,向请求中添加了各种参数但没有任何帮助。由于在 500px 开发人员网站或网络上几乎没有任何信息可用于在 C# 中使用此 api,因此我陷入了非常严重的困境。我已经走到了尽头!
以下是我的代码:-

1.]用于请求令牌和授权用户:-

        string normalizedUrl;
        string normalizedRequestParameters;
        OAuth.OAuthBase myOAuth = new OAuth.OAuthBase();
        try
        {
            Uri uri = new Uri("https://api.500px.com/v1/oauth/request_token");
           string  consumerKey = "u26X4av9ydNPd7kteT7bunfcdjHqVttYWIDOC1lA";
           string  consumerSecret = "73iaFPqCR4xkH3dgYIcPauTqhI6tMHWChDivnOP7";
            string timeStamp = myOAuth.GenerateTimeStamp();
            string nonce = myOAuth.GenerateNonce();
            myOAuth.includeVersion = true;
            string signature = myOAuth.GenerateSignature(uri, consumerKey, consumerSecret,
                                    "", "", "GET", timeStamp, nonce, OAuth.OAuthBase.SignatureTypes.HMACSHA1,
                                                 out normalizedUrl, out normalizedRequestParameters);

            string authorizationUrl = normalizedUrl + "?" + normalizedRequestParameters + "&oauth_signature=" + myOAuth.UrlEncode(signature);
                            Uri signInUrl = new Uri(authorizationUrl);



            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(signInUrl);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            StreamReader stIn = new StreamReader(response.GetResponseStream());

            string responseString = stIn.ReadToEnd();

            stIn.Close();

            //oauth_token=cf40227bb7ede4d6e56ff790324761b3&oauth_token_secret=0bcb59dff2c1d095739c86c534fc62d7ed224fecfe8744d48c9c95f36211382f

            if (responseString.Contains("oauth_token=") && responseString.Contains("oauth_token_secret="))
            {
                String RespToken = responseString.Split('&')[0].Replace("oauth_token=", "");
                String RespSecret = responseString.Split('&')[1].Replace("oauth_token_secret=", "");

                uri = new Uri("https://api.500px.com/v1/oauth/authorize");
                timeStamp = myOAuth.GenerateTimeStamp();
                nonce = myOAuth.GenerateNonce();
                myOAuth.includeVersion = true;
                signature = myOAuth.GenerateSignature(uri, consumerKey, consumerSecret, RespToken

                    , RespSecret, "GET", timeStamp, nonce, OAuth.OAuthBase.SignatureTypes.HMACSHA1,

                    out normalizedUrl, out normalizedRequestParameters);
                Console.WriteLine("Signature=="+signature);
                authorizationUrl = normalizedUrl + "?" + normalizedRequestParameters + "&oauth_signature=" + myOAuth.UrlEncode(signature);

                Uri signInUrl1 = new Uri(authorizationUrl);
                webBrowser1.Navigate(signInUrl1);

}


2.]用户点击授权此应用程序获取access_token后:-

     private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        string parameters;
         string normalizedUrl;
        string normalizedRequestParameters;
        string consumerKey = "u26X4av9ydNPd7kteT7bunfcdjHqVttYWIDOC1lA";
        string consumerSecret = "73iaFPqCR4xkH3dgYIcPauTqhI6tMHWChDivnOP7";
        OAuth.OAuthBase myOAuth = new OAuth.OAuthBase();

         try

        {
           if (e.Url.ToString().Contains("https://www.xyz.com/"))
            {
                String url = (e.Url.ToString()).Replace("https://www.xyz.com/?","");

                if( url.Contains("oauth_token="))
                {
                  string OAuthToken = url.Split('&')[0].Replace("oauth_token=", "");
                  var uri = "https://api.500px.com/v1/oauth/access_token";
                  OAuthBase oAuth = new OAuthBase();
                  var nonce = oAuth.GenerateNonce();
                  var timeStamp = oAuth.GenerateTimeStamp();                
                  var signature = oAuth.GenerateSignature(new Uri(uri), consumerKey, consumerSecret,
                  OAuthToken, String.Empty, "POST", timeStamp, nonce,
                  OAuthBase.SignatureTypes.HMACSHA1, out normalizedUrl, out  normalizedRequestParameters);
                  signature = HttpUtility.UrlEncode(signature);
                  var requestUri = normalizedUrl + "?" + "oauth_callback=https://www.xyz.com" +"?"+ normalizedRequestParameters + "&oauth_signature=" + myOAuth.UrlEncode(signature);
                  Console.WriteLine(requestUri);


                  var request = (HttpWebRequest)WebRequest.Create(requestUri.ToString());
                  request.Method = WebRequestMethods.Http.Post;
                  request.ContentType = "application/json";
                //  request.ContentType = "application / x - www - form - urlencoded";
                  //request.Credentials = CredentialCache.DefaultCredentials;
                  //request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)";
                  var response = request.GetResponse();
                  var reader = new StreamReader(response.GetResponseStream());
                  var accessToken = reader.ReadToEnd();
                    }
                    }
            catch(Exception ex)
            {
              Console.Writeln(ex.toString());
            }
            }


下面是我的代码中断的行:-

         var response = request.GetResponse();

在这个问题上完全束手无策,无法找到它的根源。任何帮助任何方向都将受到高度赞赏。任何建议都会有很大帮助!!
提前致谢!

【问题讨论】:

  • 鉴于文档完全不准确,我也一直在努力解决 500px 问题。您的代码至少帮助我进入了该过程的第二阶段。我的直觉是,鉴于文档错误地说在 GET 工作时使用 POST,我认为最后一步很可能也是 GET。将发布进度!

标签: c# api oauth


【解决方案1】:

这是怎么做的:

  1. 使用 GET 而不是 POST(POST 可能有效;我没有尝试过,并且在 500px 和 POST 方面收效甚微)

  2. 在查询 URL 中包含您在授权步骤中收到的 oauth_verifier

  3. 使用您的消费者密钥和请求令牌秘密签署整个查询(在步骤 1 中返回)

应在 HTTP 回复正文中返回“oauth_token=...&oauth_token_secret=...”的代码 sn-p。

确保您的 OAuth 实施不会删除任何以“oauth_”开头的参数!我的是,它正在剥离 500px 所需的 oauth_verifier 参数。

        OAuth.OAuthBase oauth = new OAuth.OAuthBase();

        string strUrl = "";
        string strParams = "";

        string signature = oauth.GenerateSignature(new Uri(API_URL + "oauth/access_token?oauth_verifier=" + this.oauthVerifier),
                                            this.consumerKey, this.consumerSecret, this.oauthToken, this.requestTokenSecret,
                                            "GET", oauth.GenerateTimeStamp(), oauth.GenerateNonce(),
                                            OAuth.OAuthBase.SignatureTypes.HMACSHA1,
                                            out strUrl, out strParams);

        string authorizationUrl = strUrl + "?" + strParams + "&oauth_signature=" + System.Web.HttpUtility.UrlEncode(signature);
        Debug.WriteLine("url>" + authorizationUrl);

        Response reply = SendGetRequest(authorizationUrl);
        if (reply.Success)
        {
            Debug.WriteLine("access_token>" + reply.Content);

【讨论】:

  • 嗨@Chris,非常感谢您的回答。我几乎已经放弃了这个,但肯定会在这个周末左右尝试你的方式,如果它对我有用,我会接受答案。快乐编码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多