Как добавить, удалить, обновить событие в календаре Google в UWP, используя Htttpclient Object - PullRequest
0 голосов
/ 19 сентября 2019

enter code here Я хочу добавить событие в календарь Google, используя объект httpClient.Я выполнил авторизацию, она работает, она извлекает данные о событиях календаря, и теперь я хочу добавить событие в календарь Google. Заранее спасибо.

static string clientId = "your id";
        static string redirectURI = "pw.sample2:/oauth2redirect";
        //static string redirectURI = "com.contoso.showproduct";

        static string scope = "https://www.googleapis.com/auth/calendar.readonly";
        static string SpotifyUrl = $"https://accounts.google.com/o/oauth2/auth?client_id={clientId}&redirect_uri={Uri.EscapeDataString(redirectURI)}&response_type=code&scope={Uri.EscapeDataString(scope)}";
        Uri StartUri = new Uri(SpotifyUrl);
        Uri EndUri = new Uri(redirectURI);

        public MainPage()
        {
            this.InitializeComponent();
            Get();
        }



        private async  void Get()
        {
            WebAuthenticationResult WebAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, StartUri, EndUri);
            if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success)
            {
                var decoder = new WwwFormUrlDecoder(new Uri(WebAuthenticationResult.ResponseData).Query);
                if (decoder[0].Name != "code")
                {
                    System.Diagnostics.Debug.WriteLine($"OAuth authorization error: {decoder.GetFirstValueByName("error")}.");
                    return;
                }

                var autorizationCode = decoder.GetFirstValueByName("code");


                //Get Access Token
                var pairs = new Dictionary<string, string>();
                pairs.Add("code", autorizationCode);
                pairs.Add("client_id", clientId);
                pairs.Add("redirect_uri", redirectURI);
                pairs.Add("grant_type", "authorization_code");

                var formContent = new Windows.Web.Http.HttpFormUrlEncodedContent(pairs);

                var client = new Windows.Web.Http.HttpClient();
                var httpResponseMessage = await client.PostAsync(new Uri("https://www.googleapis.com/oauth2/v4/token"), formContent);
                if (!httpResponseMessage.IsSuccessStatusCode)
                {
                    System.Diagnostics.Debug.WriteLine($"OAuth authorization error: {httpResponseMessage.StatusCode}.");
                    return;
                }

                string jsonString = await httpResponseMessage.Content.ReadAsStringAsync();
                var jsonObject = Windows.Data.Json.JsonObject.Parse(jsonString);
                var accessToken = jsonObject["access_token"].GetString();


                //Call Google Calendar API
                using (var httpRequest = new Windows.Web.Http.HttpRequestMessage())
                {
                    string calendarAPI = "https://www.googleapis.com/calendar/v3/users/me/calendarList";

                    httpRequest.Method = Windows.Web.Http.HttpMethod.Get;
                    httpRequest.RequestUri = new Uri(calendarAPI);
                    httpRequest.Headers.Authorization = new Windows.Web.Http.Headers.HttpCredentialsHeaderValue("Bearer", accessToken);

                    var response = await client.SendRequestAsync(httpRequest);

                    if (response.IsSuccessStatusCode)
                    {
                        var listString = await response.Content.ReadAsStringAsync();
                        //TODO
                    }
                }


            }
        }

Код выше работает для авторизации.

  public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        /// <summary>
        /// Invoked when the application is launched normally by the end user.  Other entry points
        /// will be used such as when the application is launched to open a specific file.
        /// </summary>
        /// <param name="e">Details about the launch request and process.</param>
        protected async override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // Do not repeat app initialization when the Window already has content,
            // just ensure that the window is active
            if (rootFrame == null)
            {
                // Create a Frame to act as the navigation context and navigate to the first page
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: Load state from previously suspended application
                }

                // Place the frame in the current Window
                Window.Current.Content = rootFrame;

            }

            if (e.PrelaunchActivated == false)
            {
                if (rootFrame.Content == null)
                {
                    // When the navigation stack isn't restored navigate to the first page,
                    // configuring the new page by passing required information as a navigation
                    // parameter
                    rootFrame.Navigate(typeof(MainPage ), e.Arguments);
                }
                // Ensure the current window is active
                Window.Current.Activate();
            }
            //var messageDialog = new MessageDialog("No internet connection has been found.");
            //await messageDialog.ShowAsync();
        }

        /// <summary>
        /// Invoked when the application is launched through a custom URI scheme, such as
        /// is the case in an OAuth 2.0 authorization flow.
        /// </summary>
        /// <param name="args">Details about the URI that activated the app.</param>
        protected async override void OnActivated(IActivatedEventArgs args)
        {
            // When the app was activated by a Protocol (custom URI scheme), forwards
            // the URI to the MainPage through a Navigate event.
            if (args.Kind == ActivationKind.Protocol)
            {
                // Extracts the authorization response URI from the arguments.
                ProtocolActivatedEventArgs protocolArgs = (ProtocolActivatedEventArgs)args;
                Uri uri = protocolArgs.Uri;
                Debug.WriteLine("Authorization Response: " + uri.AbsoluteUri);

                // Gets the current frame, making one if needed.
                var frame = Window.Current.Content as Frame;
                if (frame == null)
                    frame = new Frame();

                // Opens the URI for "navigation" (handling) on the MainPage.
                frame.Navigate(typeof(MainPage), uri);
                Window.Current.Content = frame;
                Window.Current.Activate();
            }
            //var messageDialog = new MessageDialog("resume");
            //await messageDialog.ShowAsync();
        }

        /// <summary>
        /// Invoked when Navigation to a certain page fails
        /// </summary>
        /// <param name="sender">The Frame which failed navigation</param>
        /// <param name="e">Details about the navigation failure</param>
        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }

        /// <summary>
        /// Invoked when application execution is being suspended.  Application state is saved
        /// without knowing whether the application will be terminated or resumed with the contents
        /// of memory still intact.
        /// </summary>
        /// <param name="sender">The source of the suspend request.</param>
        /// <param name="e">Details about the suspend request.</param>
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: Save application state and stop any background activity
            deferral.Complete();
        }

и мой файл app.xaml

Теперь я хочу создать событие в календаре Google.

...