当前位置: 首页 > 知识库问答 >
问题:

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

沈弘文
2023-03-14

我正在尝试访问Google API v3日历列表,但我不断收到401/404响应,尽管我为用户提供了有效的AccessToken
(我完成了Web服务器应用程序的OAuth2协议,并收到https://www.googleapis.com/auth/calendar权限)

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

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

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个答案

江超英
2023-03-14

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

显然,尽管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;
 类似资料:
  • 我是Google日历API和PHP的新手,我似乎不知道如何实现我想做的事情。基本上,我想从calendarID为的google日历中检索事件webapps098@gmail.com.我当前的代码是这样的 我收到错误: 异常Google_ServiceException消息错误调用GEThttps://www.googleapis.com/calendar/v3/calendars/webapps0

  • 我曾经请求caldav服务器为给定用户提供所有定义的日历。这适用于Fruux/ownCloud(Sabre)和GCalendar(经典方法)。请求如下: 移动到Google OAuth2有不同的调用,ulrstr:类似https://apidata.googleusercontent.com/caldav/v2/{calid}/user的内容 这里的“calid”必须是一个特定的日历[1]iis说

  • 我是新手,但我想将google API与PHP结合使用,但它不起作用。我已经创建了

  • 我从快速入门开始(https://developers.google.com/google-apps/calendar/quickstart/python)而且效果很好。然后我尝试用这个指南插入事件(https://developers.google.com/google-apps/calendar/create-events)。我将此代码添加到quickstart的代码中,但出现错误。如何查看我

  • 我希望你能帮帮我。 我正在尝试使用Oauth2身份验证连接到Google(日历)API。 为此,我遵循了以下步骤: 通过Google开发者控制台注册应用程序 使用composer(google-api-php-client)安装客户端库 将以下脚本放置在供应商文件夹中: 不幸的是,在单击“接受”按钮进行身份验证后,我得到了一个错误: 到目前为止,谷歌的研究并没有帮助。 可能的解决办法: > 正确设