Пример пакетного запроса Google Indexing API с использованием .NET

Может ли кто-нибудь предоставить пример кода на C#, который позволит мне отправить пакетный запрос в Google Indexing API для действия URL_UPDATED? В приведенном ниже коде показано, что я использую в настоящее время для выполнения одного действия URL_UPDATED с помощью одного HTTP-запроса.

В идеале я хотел бы предоставить строку [] URL-адресов, которую можно передать пакетной функции.

Спасибо.

using Google.Apis.Auth.OAuth2;
using Google.Apis.Http;
using Microsoft.AspNetCore.Hosting;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace GoogleServiceAccounts
{
  public class Indexing
  {
    public GoogleServiceAccount _googleServiceAccount;
    private IConfigHelper _configHelper;
    private GoogleCredential _googleCredential;
    private IHostingEnvironment _hostingEnvironment;

    public Indexing(IConfigHelper configHelper, IHostingEnvironment hostingEnvironment)
    {
      _configHelper = configHelper;
      _hostingEnvironment = hostingEnvironment;
      _googleServiceAccount = _configHelper.Settings.GoogleServiceAccounts.SingleOrDefault(a => a.Name == "Indexing");
      _googleCredential = GetGoogleCredential();
    }

    public async Task<HttpResponseMessage> AddOrUpdateJob(string jobUrl)
    {
      return await PostJobToGoogle(jobUrl, "URL_UPDATED");
    }

    public async Task<HttpResponseMessage> CloseJob(string jobUrl)
    {
      return await PostJobToGoogle(jobUrl, "URL_DELETED");
    }

    public async Task<HttpResponseMessage> PostJobToGoogle(string jobUrl, string action)
    {
      var serviceAccountCredential = (ServiceAccountCredential)_googleCredential.UnderlyingCredential;

      string googleApiUrl = "https://indexing.googleapis.com/v3/urlNotifications:publish";

      var requestBody = new
      {
        url = jobUrl,
        type = action
      };

      var httpClientHandler = new HttpClientHandler();

      var configurableMessageHandler = new ConfigurableMessageHandler(httpClientHandler);

      var configurableHttpClient = new ConfigurableHttpClient(configurableMessageHandler);

      serviceAccountCredential.Initialize(configurableHttpClient);

      HttpContent content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

      var response = await configurableHttpClient.PostAsync(new Uri(googleApiUrl), content);

      return response;
    }

    private GoogleCredential GetGoogleCredential()
    {
      var path = _hostingEnvironment.MapPath(_googleServiceAccount.KeyFile);
      GoogleCredential credential;

      using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
      {
        credential = GoogleCredential.FromStream(stream).CreateScoped(new[] { "https://www.googleapis.com/auth/indexing" });
      }

      return credential;
    }
  }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 420
1

Ответы 1

Я расширил ваш пример, вот код для выполнения пакетного запроса.

private async Task<List<PublishUrlNotificationResponse>> BatchAddUpdateIndex(IEnumerable<string> jobUrls, string action)
{
        var credential = _googleCredential.UnderlyingCredential;

        var googleIndexingApiClientService = new IndexingService(new BaseClientService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new BatchRequest(googleIndexingApiClientService);

        var notificationResponses = new List<PublishUrlNotificationResponse>();

        foreach (var url in jobUrls)
        {
            var urlNotification = new UrlNotification
            {
                Url = url,
                Type = action
            };

            request.Queue<PublishUrlNotificationResponse>(
                new UrlNotificationsResource.PublishRequest(googleIndexingApiClientService, urlNotification), (response, error, i, message) =>
                {
                    notificationResponses.Add(response);
                });
        }

        await request.ExecuteAsync();

        return await Task.FromResult(notificationResponses);
}

Вот пример получения статуса URL-адреса в пакетном режиме.

private async Task<List<UrlNotificationMetadata>> BatchGetIndexStatus(IEnumerable<string> jobUrls)
{
        var credential = _googleCredential.UnderlyingCredential;

        var googleIndexingApiClientService = new IndexingService(new BaseClientService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new BatchRequest(googleIndexingApiClientService);

        var metaDataResponses = new List<UrlNotificationMetadata>();

        foreach (var url in jobUrls)
        {
            request.Queue<UrlNotificationMetadata>(
                new GetMetadataRequest(googleIndexingApiClientService, url), (response, error, i, message) =>
                {
                    metaDataResponses.Add(response);
                });
        }

        await request.ExecuteAsync();

        return await Task.FromResult(metaDataResponses);
}

Вы также можете взглянуть на мой блог об этом, там также есть образец репозитория, который вы можете найти в конце моего сообщения в блоге.

Другие вопросы по теме