C# Google日历API v3:使用AccessToken检索日历列表

C# Google日历API v3:使用AccessToken检索日历列表,c#,google-api,oauth-2.0,google-calendar-api,C#,Google Api,Oauth 2.0,Google Calendar Api,我正在尝试访问Google API v3日历列表,但我不断收到401/404响应,即使我为用户提供了有效的AccessToken。 (我完成了测试并获得了许可) 很难找到好的文档,谷歌网站本身并没有太大帮助,搜索中充斥着旧的v2信息或使用SDK。通常我可以将python回复翻译成c#,但在这种情况下,即使这样也帮不了我 所以我很紧张,但我可能忘记了一些非常简单的事情,比如缺少参数之类的,所以如果有人能快速查看一下这段代码并告诉我我做错了什么,我将不胜感激 var applicationKey=m

我正在尝试访问Google API v3日历列表,但我不断收到401/404响应,即使我为用户提供了有效的AccessToken。
(我完成了测试并获得了许可)

很难找到好的文档,谷歌网站本身并没有太大帮助,搜索中充斥着旧的v2信息或使用SDK。通常我可以将python回复翻译成c#,但在这种情况下,即使这样也帮不了我

所以我很紧张,但我可能忘记了一些非常简单的事情,比如缺少参数之类的,所以如果有人能快速查看一下这段代码并告诉我我做错了什么,我将不胜感激

var applicationKey=moduleModel.Application.Key;
var userID=moduleModel.User.userID;
var accessToken=moduleModel.User.accessToken.Token;
//我是否使用查询字符串似乎没有任何区别
//参数或请求标头来指定访问令牌
var sendAccessTokenAsHeader=
!(Request.QueryString[“SendAccessTokenAsHeader”]=“0”);
//我尝试导航到一个特定的用户,但结果是找不到404
var requestSpecificUserID=
Request.QueryString[“RequestSpecificUserID”]=“1”;
//包含或省略我的API_密钥似乎没有任何区别
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));
}
其他的
{
urlBuilder.Append
(“/calendar/v3/users/me/calendarList”);
}
var参数连接符=“?”;
如果(sendApplicationKey)
{
urlBuilder.Append
(
字符串格式
(
"{0}{1}={2}",
参数接合器,
“钥匙”,
HttpUtility.UrlEncode(applicationKey)
)
);
parameterJoiner=“&”;
}
如果(!sendAccessTokenAsHeader)
{
urlBuilder.Append
(
字符串格式
(
"{0}{1}={2}",
参数接合器,
“访问令牌”,
HttpUtility.UrlEncode(accessToken)
)
);
parameterJoiner=“&”;
}
var httpWebRequest=httpWebRequest.Create(urlBuilder.ToString())
作为HttpWebRequest;
httpWebRequest.CookieContainer=新CookieContainer();
如果(sendAccessTokenAsHeader)
{
httpWebRequest.Headers[“Authorization”]=string.Format
(
“持票人{0}”,
accessToken
);
}
//GetSafeResponse只是捕获WebException的扩展方法
//当HttpStatusCode!=好啊
var response=httpWebRequest.GetSafeResponse();
//返回401(requestSpecificUserID=false)
//或404(requestSpecificUserID=true)
var responseText=response.GetResponseText();
返回响应文本;

提前谢谢你

我通过阅读问题找到了答案

显然,即使Google文档根本没有提到它,参数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;