2012-11-16 40 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;