Пример пакетного запроса API индексации Google с использованием.NET
Кто-нибудь может предоставить пример кода на C#, который позволит мне отправить пакетный запрос в API индексации Google для действия 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;
}
}
}
0 ответов
Я расширил ваш пример, вот код для выполнения пакетного запроса.
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);
}
Вы также можете взглянуть на мою запись в блоге об этом, есть также образец репозитория, который вы можете найти в конце моего сообщения в блоге.