2012-11-16 41 views
0

我试图访问谷歌API V3 Calendarlist但我不断收到四百零四分之四百零一反应,即使我有一个有效的accessToken的用户。
(我完成了OAuth2 protocol for Web Server Applications并获得了https://www.googleapis.com/auth/calendar许可)谷歌日历API第3版:使用的accessToken检索CalendarList

它已经很难找到良好的文档对于这一点,谷歌的网站本身是不是非常有帮助,并搜索都充满了旧v2的信息,或使用的SDK。通常我可以做翻译蟒蛇答复C#,但在这种情况下,即使没有帮助我。

所以我拉我的头发,但我可能忘记了一些非常简单的东西,像一个缺少的参数或somesuch,所以它将不胜感激,如果有人会快速浏览此代码并告诉我什么做错了。

var applicationKey = moduleModel.Application.Key; 
var userID = moduleModel.User.UserID; 
var accessToken = moduleModel.User.AccessToken.Token; 

// It doesn't seem to make any difference whether I use the querystring 
// parameter or the request header to specify the access_token 
var sendAccessTokenAsHeader = 
    !(Request.QueryString["SendAccessTokenAsHeader"] == "0"); 

// I tried navigating to a specific user but it results in a 404 Not Found 
var requestSpecificUserID = 
    Request.QueryString["RequestSpecificUserID"] == "1"; 

// Including or omitting my API_KEY doesn't seem to make any difference 
var sendApplicationKey = 
    !(Request.QueryString["SendApplicationKey"] == "0"); 

var urlBuilder = new System.Text.StringBuilder(); 

urlBuilder.Append("https://"); 
urlBuilder.Append("www.googleapis.com"); 

if (requestSpecificUserID) 
{ 
    urlBuilder.Append 
     (string.Format("/calendar/v3/users/{0}/calendarList", userID)); 
} 
else 
{ 
    urlBuilder.Append 
     ("/calendar/v3/users/me/calendarList"); 
} 

var parameterJoiner = "?"; 

if (sendApplicationKey) 
{ 
    urlBuilder.Append 
    (
     string.Format 
     (
      "{0}{1}={2}", 
      parameterJoiner, 
      "key", 
      HttpUtility.UrlEncode(applicationKey) 
     ) 
    ); 
    parameterJoiner = "&"; 
} 

if (!sendAccessTokenAsHeader) 
{ 
    urlBuilder.Append 
    (
     string.Format 
     (
      "{0}{1}={2}", 
      parameterJoiner, 
      "access_token", 
      HttpUtility.UrlEncode(accessToken) 
     ) 
    ); 
    parameterJoiner = "&"; 
} 

var httpWebRequest = HttpWebRequest.Create(urlBuilder.ToString()) 
    as HttpWebRequest; 
httpWebRequest.CookieContainer = new CookieContainer(); 

if (sendAccessTokenAsHeader) 
{ 
    httpWebRequest.Headers["Authorization"] = string.Format 
    (
     "Bearer {0}", 
     accessToken 
    ); 
} 

// GetSafeResponse is just an extension method to catch the WebException 
// when the HttpStatusCode != OK 

var response = httpWebRequest.GetSafeResponse(); 

// returns 401 (requestSpecificUserID = false) 
// or 404 (requestSpecificUserID = true) 

var responseText = response.GetResponseText(); 

return responseText; 

预先感谢您!

回答

1

我通过阅读this问题找到我的答案。

显然,即使谷歌文档,根本不会提到它,参数minAccessRole是必需的。

工作例如:

var accessToken = moduleModel.User.AccessToken.Token; 

var urlBuilder = new System.Text.StringBuilder(); 

urlBuilder.Append("https://"); 
urlBuilder.Append("www.googleapis.com"); 
urlBuilder.Append("/calendar/v3/users/me/calendarList"); 
urlBuilder.Append("?minAccessRole=writer"); 

var httpWebRequest = HttpWebRequest.Create(urlBuilder.ToString()) 
    as HttpWebRequest; 

httpWebRequest.CookieContainer = new CookieContainer(); 
httpWebRequest.Headers["Authorization"] = 
    string.Format("Bearer {0}", accessToken); 

var response = httpWebRequest.GetSafeResponse(); 

var responseText = response.GetResponseText(); 

return responseText;