问题描述
我试图访问Google API v3 Calendarlist,但即使我为用户提供了有效的AccessToken,我仍然收到401/404响应。
(我完成了,并收到权限)
很难找到好的这方面的文档,谷歌网站本身并不是非常有用,搜索充满了旧的v2信息或使用SDK。通常我可以将python回复翻译成c#,但在这种情况下,即使这样也没有帮助我。
所以我拉我的头发,但我可能忘记了一些非常简单的东西,比如一个缺少的参数或者其他东西,所以如果有人会快速浏览一下这段代码并告诉我我做错了什么,那将不胜感激。
var applicationKey = moduleModel.Application.Key;
var userID = moduleModel.User.UserID;
var accessToken = moduleModel.User.AccessToken.Token;
//我使用查询字符串
//参数或请求头指定access_token
var sendAccessTokenAsHeader =
似乎没有什么区别!(Request.QueryString [SendAccessTokenAsHeader] ==0);
//我尝试导航到一个特定的用户,但它导致404 Not Found
var requestSpecificUserID =
Request.QueryString [RequestSpecificUserID] ==1;
//包含或省略我的API_KEY似乎没有任何区别
var sendApplicationKey =
!(Request.QueryString [SendApplicationKey== =0)) ;
var urlBuilder = new System.Text.StringBuilder();
urlBuilder.Append(https://);
urlBuilder.Append(www.googleapis.com);
$ b $ 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 =&;
$ b $ 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只是一个扩展方法来捕获WebException
//当HttpStatusCode!= OK
var response = httpWebRequest。 GetSafeResponse();
//返回401(requestSpecificUserID = false)
//或404(requestSpecificUserID = true)
var responseText = response.GetResponseText();
return responseText;
预先感谢您!
我通过阅读问题。
显然,即使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;
I am trying to access the Google API v3 Calendarlist but I keep getting 401/404 responses even though I have a valid AccessToken for the User.
(I completed the OAuth2 protocol for Web Server Applications and received the https://www.googleapis.com/auth/calendar permission)
It's been rather difficult to find good documentation for this, the google site itself isn't very helpful and searches are full of old v2 information or use SDKs. Usually I can make do with translating python replies to c# but in this case even that didn't help me.
So I'm pulling my hair out but I'm probably forgetting something very simple here like a missing parameter or somesuch, so it would be greatly appreciated if someone would take a quick look at this code and tell me what I'm doing wrong.
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;
Thank you in advance!
I found my answer by reading this question.
Apparently, even though the Google documentation does not mention it at all, the parameter minAccessRole is required.
Working example:
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;
这篇关于Google Calendar API v3:使用AccessToken检索CalendarList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!