WebRequest 400对api的错误请求

时间:2015-01-21 07:17:09

标签: c# httpwebrequest instagram-api

我正在向Instagram API发送webrequest,并收到400个错误的请求,但我想这不是特定于instagram的东西,并且是我的代码中的一般错误。 这是我的代码。"代码"此请求中的参数是从先前的request.Code中断" GetResponse"方法

  string clientID = "myclientid";
  string clientsecret="myclientsecret";
  string redirectURL = "http://localhost:64341/"; 
 string webrequestUri = "https://api.instagram.com/oauth/
  access_token?  client_id=" + clientID + "&client_secret=
  " + clientsecret +   "&grant_type=authorization_code"                                            + "&redirect_uri="redirectURL+"&code="
+Request.QueryString["code"].ToString();
WebRequest request = WebRequest.Create(webrequestUri);
request.Method = "POST";
WebResponse response = request.GetResponse();

1 个答案:

答案 0 :(得分:1)

C#/ asp.net工作示例:

namespace InstagramLogin.Code
{
    public class InstagramAuth
    {
        private InstagramClient myApp = new InstagramClient();

        public string genUserAutorizationUrl()
        {
            return String.Format(myApp.OAuthAutorizeURL, myApp.ClientId, myApp.RedirectUri);
        }

        public AuthUserApiToken getTokenId(string CODE)
        {
            //curl \-F 'client_id=CLIENT-ID' \
            //-F 'client_secret=CLIENT-SECRET' \
            //-F 'grant_type=authorization_code' \
            //-F 'redirect_uri=YOUR-REDIRECT-URI' \
            //-F 'code=CODE' \https://api.instagram.com/oauth/access_token

            var wc = new WebClient();
            var wcResponse = wc.UploadValues(myApp.AuthAccessTokenUrl, 
                                new System.Collections.Specialized.NameValueCollection() { 
                                    { "client_id", myApp.ClientId }, 
                                    { "client_secret", myApp.ClientSecret },
                                    { "grant_type", "authorization_code"},
                                    { "redirect_uri", myApp.RedirectUri},
                                    { "code", CODE}
                                });
            var decodedResponse = wc.Encoding.GetString(wcResponse);
            AuthUserApiToken UserApiToken = JsonConvert.DeserializeObject<AuthUserApiToken>(decodedResponse);

            return UserApiToken;
        }
    }
}

你的对象:

    namespace InstagramLogin.Code
    {
    public class InstagramClient
        {

            private const string ApiUriDefault = "https://api.instagram.com/v1/";
            private const string OAuthUriDefault = "https://api.instagram.com/oauth/";
            private const string RealTimeApiDefault = "https://api.instagram.com/v1/subscriptions/";

            private const string OAuthAutorizeURLDefault = "https://api.instagram.com/oauth/authorize/?client_id={0}&redirect_uri={1}&response_type=code";
            private const string AuthAccessTokenUrlDefault = "https://api.instagram.com/oauth/access_token";

            private const string clientId = "clientid";
            private const string clientSecretId = "clientsecretid";
            private const string redirectUri = "http://localhost/InstagramLogin/InstaAuth.aspx";
            private const string websiteUri = "http://localhost/InstagramLogin/InstaAuth.aspx";

            public string ApiUri { get; set; }
            public string OAuthUri { get; set; }
            public string RealTimeApi { get; set; }


            public string OAuthAutorizeURL { get { return OAuthAutorizeURLDefault; } }
            public string ClientId { get { return clientId; } }
            public string ClientSecret { get { return clientSecretId; } }
            public string RedirectUri { get { return redirectUri; } }
            public string AuthAccessTokenUrl { get { return AuthAccessTokenUrlDefault; } }
//removed props
    }
    }

instagram loged用户:

namespace InstagramLogin.Code
{
    public class SessionInstaAuthUser
    {

            public bool isInSession()
            {
                return HttpContext.Current.Session["AuthUserApiToken"] != null;
            }

            public AuthUserApiToken get()
            {
                if (isInSession())
                {
                    return HttpContext.Current.Session["AuthUserApiToken"] as AuthUserApiToken;
                }
                return null;
            }

            public void set(AuthUserApiToken value)
            {
                HttpContext.Current.Session["AuthUserApiToken"] = value;
            }

            public void clear()
            {
                if (isInSession())
                {
                    HttpContext.Current.Session["AuthUserApiToken"] = null;
                }
            }

    }
}

标记:

<asp:Button ID="btnInstaAuth"
        Text="Click here to get instagram auth"
        runat="server" />

代码背后:

//objects
private InstagramClient InstagramApiCLient = new InstagramClient();
        private InstagramAuth AuthManager = new InstagramAuth();
        private SessionInstaAuthUser SesssionInstaUser = new SessionInstaAuthUser();

//单击使用测试登录 - 记录用户(在会话中)

void btnInstaAuth_Click(Object sender,
                               EventArgs e)
        {
            btnGetInstaPosts.Visible = false;
            if (SesssionInstaUser.isInSession())
            {
                SesssionInstaUser.clear();
                Button clickedButton = (Button)sender;
                clickedButton.Text = "Click here to get instagram auth";
                btnInstaAuth.Visible = true;
            }
            else
            {
                Response.Redirect(AuthManager.genUserAutorizationUrl());
            }
        }

你可以在这堂课中找到你需要的东西 InstagramAuth 抱歉,如果我忘了删除一些额外的方法或属性,请将其剥离。

此按钮可以在所有页面上使用,仍然不要忘记在Instagram中设置的页面上添加页面加载作为登录页面,查询字符串解析:

//here you read the token instagram generated and append it to the session, or get the error :) 

    if (!IsPostBack)
                {
                    if (!SesssionInstaUser.isInSession())
                    {
                        if (Request.QueryString["code"] != null)
                        {


                            var token = AuthManager.getTokenId(Request.QueryString["code"]);
                            SesssionInstaUser.set(token);
                            //set login button to have option to log out
                            btnInstaAuth.Text = token.user.username + " leave instagtam oAuth";
                            Response.Redirect(Request.Url.ToString().Split('?')[0]);
                    }
                    else
                        if (Request.QueryString["error"] != null)
                        {
                            btnInstaAuth.Text = Request.QueryString["error_description"];
                        }
                }
            }

抱歉,如果我错过了某些内容,那么在第一堂课中就会实现php卷入c#。

更新(我忘记了一些事情),insta用户obj:)

namespace InstagramLogin.Code
{
    public class UserLogged
    {
        public string id { get; set; }
        public string username { get; set; }
        public string full_name { get; set; }
        public string profile_picture { get; set; }
    }

    public class AuthUserApiToken
    {      
        public string access_token { get; set; }
        public UserLogged user { get; set; }
    }
}