You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React中借助Fetch API及Access Token创建Google日历事件

在React中使用Fetch API结合Google Access Token创建日历事件

以下是修改后的完整代码,已集成Fetch API创建Google日历事件的逻辑:

import React, { useEffect, useState } from 'react'
import jwt_decode from "jwt-decode";

const CLIENT_ID = '25262567698-tsaoo718sc35n3k25os074b17jklc5rm.apps.googleusercontent.com';
const SCOPES = 'https://www.googleapis.com/auth/calendar';

const TEST_EVENT = {
    'summary': 'Example Event',
    'location': 'New York, NY',
    'description': 'a description for this',
    'start': {
        'dateTime': '2023-03-26T10:00:00-04:00',
        'timeZone': 'America/New_York',
    },
    'end': {
        'dateTime': '2023-03-26T11:00:00-04:00',
        'timeZone': 'America/New_York',
    },
};

const TestGIS = (props) => {
    const [user, setUser] = useState({});
    const [tokenClient, setTokenClient] = useState({});

    function handleCallbackResponse(response) {
        console.log('encoded JWT ID token:' + response.credential);
        var userObject = jwt_decode(response.credential);
        console.log(userObject)
        setUser(userObject);
        document.getElementById('signInDiv').hidden = true;
    }

    function handleSignOut(event) {
        setUser({});
        document.getElementById('signInDiv').hidden = false;
    }

    // 使用Access Token创建日历事件的核心函数
    async function createEventWithToken(accessToken, eventData) {
        try {
            const response = await fetch('https://www.googleapis.com/calendar/v3/calendars/primary/events', {
                method: 'POST',
                headers: {
                    'Authorization': `Bearer ${accessToken}`,
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(eventData)
            });

            if (!response.ok) {
                const errorDetails = await response.json();
                throw new Error(`创建失败: ${errorDetails.error.message}`);
            }

            const createdEvent = await response.json();
            console.log('事件创建成功:', createdEvent);
            alert('日历事件创建成功!');
        } catch (error) {
            console.error('创建事件出错:', error);
            alert(`创建事件失败: ${error.message}`);
        }
    }

    useEffect(() => {
        /* global google */
        const google = window.google;
        google.accounts.id.initialize({
            client_id: CLIENT_ID,
            callback: handleCallbackResponse
        })
        google.accounts.id.renderButton(
            document.getElementById('signInDiv'),
            { theme: 'outline', size: 'large' }
        );

        setTokenClient(
            google.accounts.oauth2.initTokenClient({
                client_id: CLIENT_ID,
                scope: SCOPES,
                callback: (tokenResponse) => {
                    console.log('tokenResponse=', tokenResponse);
                    if (tokenResponse && tokenResponse.access_token) {
                        // 获取到有效Token后触发事件创建
                        createEventWithToken(tokenResponse.access_token, TEST_EVENT);
                    }
                }
            })
        );
    }, []);

    function createCalendarEvent() {
        tokenClient.requestAccessToken();
    }

    return (
        <div className='main-cover' style={{ backgroundColor: 'lightblue', width: '100%', height: '100%', zIndex: '10000' }}>
            <div id="signInDiv"></div>
            {Object.keys(user).length !== 0 &&
                <button onClick={handleSignOut}>Sign Out</button>
            }
            {Object.keys(user).length !== 0 &&
                <div>
                    <img src={user.picture} alt="User avatar" />
                    <h3>{user.name}</h3>
                    <button onClick={createCalendarEvent}>Create calendar event</button>
                </div>
            }
        </div>
    )
}
export default TestGIS

核心实现细节

1. API端点与权限

我们调用的是用户主日历的事件创建接口:

https://www.googleapis.com/calendar/v3/calendars/primary/events

若需操作其他日历,将primary替换为对应日历ID即可。当前使用的https://www.googleapis.com/auth/calendar权限支持创建/修改/删除事件,若仅需创建功能,可改用更严格的https://www.googleapis.com/auth/calendar.events权限。

2. 请求头配置

必须包含两个关键请求头:

  • Authorization: Bearer ${accessToken}:通过Access Token完成身份验证
  • Content-Type: application/json:告知API请求体为JSON格式

3. 异步请求处理

使用async/await简化异步流程:

  • 检查响应状态码,非2xx状态时解析API返回的错误信息并抛出
  • 成功创建后解析返回的事件数据,可用于后续扩展(如跳转至日历事件页面)
  • 捕获网络或API错误,给用户明确的提示信息

4. 流程逻辑

用户点击创建按钮后,tokenClient.requestAccessToken()会触发权限请求(若用户未授权过),获取有效Token后,在回调函数中直接调用createEventWithToken完成事件创建。


内容的提问来源于stack exchange,提问作者afshin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:22:55