Индекс api: Протокол проведения клинических исследований зубной пасты PRESIDENT Renome

Содержание

Получение индекса (REST API Когнитивный поиск Azure)

  • Чтение занимает 2 мин

В этой статье

Операция получения индекса получает определение индекса из когнитивный Поиск Azure.

GET https://[service name].search.windows.net/indexes/[index name]?api-version=[api-version]  
  Content-Type: application/json  
  api-key: [admin key]   

Параметры URI

ПараметрОписание
имя службыОбязательный. Задайте для него уникальное, определяемое пользователем имя службы поиска.
имя индексаОбязательный. URI запроса указывает имя возвращаемого индекса.
api-version
Обязательный. Текущая стабильная версия — api-version=2020-06-30 . Дополнительные версии см. в разделе версии API .

Заголовки запросов

Таблица ниже содержит обязательные и необязательные заголовки запроса.

ПоляОписание
Content-TypeОбязательный. Для этого заголовка необходимо задать значение application/json
api-keyОбязательный. Ключ API используется для проверки подлинности запроса к службе поиска. Это уникальное строковое значение, присваиваемое службе. Запросы GET для определения объекта должны включать в себя поле ключа API, заданное для ключа администратора (в отличие от ключа запроса). Ключ API можно найти на панели мониторинга службы поиска в портал Azure.

Текст запроса

Нет.

Ответ

Для успешного ответа возвращается код состояния: «200 ОК». Пример полезных данных ответа см. в примере запроса JSON в CREATE Index (Azure Когнитивный поиск REST API) . Текст ответа «Получение индекса» и текст ответа «Создание индекса» и «ответ» имеют одинаковый формат.

См. также раздел

Argus/McCloskey’s Coal Price Index Service

Argus/McCloskey’s Coal Price Index Service – это источник, в котором можно найти данные о значениях ценовых индексов API.

На сервисе размещены ценовые индексы, а также исторические данные о международных рынках физических объемов угля и однородных производных финансовых инструментов.

Эти индексы используются у многих участников рынка угля во всем мире. На основе индексов API 2 и API 4 рассчитывается стоимость более 90% всех торгуемых производных финансовых инструментов на уголь.


Ключевые котировки

  • API 2: Стандартная эталонная цена, используемая для расчета стоимости угля, который импортируется в Северо-Западную Европу
  • API 4: Индекс цен на все партии угля, отгружаемые на экспорт из порта Ричардс-Бей (ЮАР)
  • API 5: Цена на высокозольный уголь калорийностью 5 500 ккал/кг NAR, который экспортируется из Австралии
  • API 6: Стоимость угля калорийностью 6 000 ккал/кг NAR, который экспортируется из Австралии
  • API 8: Цена на уголь калорийностью 5 500 ккал/кг NAR с доставкой в Южный Китай
  • API 12: Цена на уголь калорийностью 5 500 ккал/кг NAR с доставкой в восточную Индию

Освещаемые рынки

  • Северо-Западная Европа: API 2
  • ЮАР: API 3, API 4
  • Австралия: API 5, API 6
  • Южный Китай: API 8
  • Колумбия: API 10
  • Индия: API 12

Ключевые особенности

  • Средние значения всех индексов за неделю
  • Ежемесячные значения всех указанных индексов
  • Ежедневные значения индексов API 2, API 4
  • Ежемесячная динамика изменения индексов API 2, API 4
  • Рассылка еженедельного ценового обзора на ваш почтовый ящик

Целевая аудитория

Argus/McCloskey’s Coal Price Index Service — это единое издание, в котором публикуются все основные индексы, применяемые на международных рынках угля. Сервис используют:

  • Торговые компании, занимающиеся покупкой и продажей угля, которым необходимы котировки издания Argus/mccloskey’s Coal Price Index в качестве ценовых индикаторов при заключении сделок и контрактов.
  • Горнодобывающие компании, заинтересованные в получении финансирования, применяют рыночные данные и котировки издания Argus/mccloskey’s Coal Price Index для разработки своей коммерческой стратегии.

API проверки правильности адресов: UPS

Исправляйте ошибки до того, как они застанут Вас врасплох

Добавьте веб-приложение для проверки правильности адресов США в Ваши интегрированные корпоративные приложения или в веб-сайт. API проверки правильности адресов выполняет непосредственную автоматическую интеграцию между Вашим веб-сайтом или корпоративной системой с UPS. С помощью  API Ваши клиенты смогут пользоваться широким спектром услуг и выбором возможностей от UPS, в то время как улучшенные процессы Вашего бизнеса станут более эффективными.

API проверки правильности адресов проверяет адрес клиента и предлагает альтернативы в случае обнаружения ошибки. Встроенный в веб-сайт или интегрированный в Ваши внутренние системы, этот инструмент поможет снизить эксплуатационные расходы и улучшить качество обслуживания клиентов.

Для кодировки и интеграции данного API потребуется помощь XML-программиста или программиста веб-сервисов. UPS предоставляет пакет разработчика, включающий руководство разработчика с информацией о способах интеграции и кодирования функций UPS в Ваши бизнес-приложения или Интернет-магазины.

Центр ресурсов разработчика

Разработчики: Загрузить API

Чем может быть полезен этот инструмент

API проверки правильности адресов доступен более чем в 40 странах и является ценным дополнением к любым корпоративным приложениям по отправке грузов в США. Например, если Ваш клиент в США ввел неверный почтовый индекс в ходе заполнения заказа в Интернете, ему будут предложены альтернативные адреса. Этот API также позволяет Вашим работникам по обслуживанию клиентов подтверждать и исправлять адреса во время разговора с клиентом по телефону.

Уменьшите вероятность доставки заказов по неверному адресу

Улучшите качество обслуживания клиентов, оказывая помощь покупателям с оформлением заказов. Уменьшите число задержек доставки по причине ввода неправильного адреса.

Индекс качества воздуха в режиме реального времени

Шкала AQI, используемая для индексации загрязнения в реальном времени на приведенной выше карте, основана на последнем

.

Благодаря всемирной организации EPA (Агенство по защите природы) удалось проделать всю важную работу в этой сфере. Просмотреть страницу можно по этой ссылке

.

IQAПоследствия для здоровьяПредостережение
0 — 50ХорошоКачество воздуха считается удовлетворительным, а загрязнение воздуха представляет собой небольшой риск или вообще отсутствуетНикто
50 — 100умеренныйКачество воздуха приемлемо; однако некоторые загрязнители создают умеренный риск для здоровья незначительного числа людей, которые сверхчувствительны к загрязнению воздуха.Физически активные дети и взрослые, а также люди с респираторными заболеваниями, такими как астма, должны ограничить длительное пребывание на улице.
100 — 150Нездоровый — для чувствительных группПредставители групп риска могут испытать проблемы со здоровьем. Широкое население вряд ли пострадает.Физически активные дети и взрослые, а также люди с респираторными заболеваниями, такими как астма, должны ограничить длительное пребывание на улице.
150 — 200НездоровыйКаждый может начать испытывать последствия для здоровья; члены чувствительных групп могут испытывать более серьезные последствия для здоровьяАктивные дети и взрослые, а также люди с респираторными заболеваниями, такими как астма, должны избегать длительного нахождения на открытом воздухе; все остальные, особенно дети, должны ограничить длительное пребывание вне помещений
200 — 300Очень НездоровыйПредупреждения опасности для здоровья в чрезвычайных ситуациях. Все граждане в зоне риска.Активные дети и взрослые, а также люди с респираторными заболеваниями, такими как астма, должны избегать нахождения на открытом воздухе; все остальные, особенно дети, должны ограничивать пребывание вне помещений.
300 — 500опасныйПредупреждение: возможны серьезные негативные последствия для здоровьяНеобходимо воздержаться от любой физической активности на открытом воздухе

Использование IndexedDB — Интерфейсы веб API

IndexedDB — это способ постоянного хранения данных внутри клиентского браузера, другими словами это NOSQL хранилище на стороне клиента. Что позволяет создавать веб-приложения с богатыми возможностями обращения к данным независимо от доступности сети, ваши приложения могут работать как онлайн, так и офлайн.

Это руководство по использованию асинхронного API для IndexedDB. Если вы не знакомы с IndexedDB, то обратитесь для начала к документу Basic Concepts About IndexedDB. .

Некоторые части документа не переведены, в основном это повсеместно принятые в программировании рекомендации, такие как обработка ошибок или что-то очевидное. Тем не менее вы можете/должны продолжить перевод. Главная цель перевода — понять основные концепции IndexedDB, обратить внимание на важные нюансы, прокомментировать исходный код и может быть добавить примеры.

Справочную документацию по IndexedDB API вы найдёте в документе IndexedDB. В нем описаны типы объектов, используемых в IndexedDB, а также синхронный и асинхронный API.

Обычная последовательность шагов при работе с IndexedDB :

  1. Открыть базу данных.
  2. Создать хранилище объектов в базе данных, над которой будут выполняться наши операции. 
  3. Запустить транзакцию и выдать запрос на выполнение какой-либо операции с базой данных, например, добавление или извлечение данных.
  4. Ждать завершения операции, обрабатывая событие DOM, на которое должен быть установлен наш обработчик.

  5. Сделать что-то с результатами (которые могут быть найдены в возвращаемом по нашему запросу объекте ).

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

Так как спецификация пока ещё находится в процессе разработки, то текущие реализации IndexedDB отличаются у различных браузеров и могут содержать имена объектов, включающие в себя префиксы браузеров. Однако, как только стандарт будет принят,  префиксы будут удалены. К настоящему моменту префиксы уже удалены в реализациях IndexedDB в Internet Explorer 10, Firefox 16 и Chrome 24. Браузеры, построенные на базе Gecko пока ещё используют префикс moz, а браузеры на базе движка webkit используют префикс webkit.

Использование экспериментальной версии IndexedDB

Для того, чтобы протестировать ваше веб-приложение на браузерах, которые пока ещё не отказались от префикса, можно воспользоваться следующим кодом:


window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;


window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;

Имейте в виду, что  реализации, в которых всё ещё используются префиксы, могут содержать ошибки, быть неполными или следовать устаревшей спецификации. Поэтому их не рекомендуется использовать в ваших рабочих проектах. Предпочтительнее отказаться от таких браузеров, чем получать от них ошибки:

if (!window.indexedDB) { window.alert("Ваш браузер не поддерживает стабильную версию IndexedDB. Такие-то функции будут недоступны"); }

Открытие базы данных

Как-то так:


var request = window.indexedDB.open("MyTestDatabase", 3);

Видите? Открытие базы данных, подобно любым другим операциям, запускается запросом.

На  самом деле запрос открытия базы данных не приводит к немедленному открытию базы или запуску транзакции. Вызов функции open() вернёт объект IDBOpenDBRequest , содержащий результат (если успешно) или ошибку, которую вы можете обработать как событие. Большинство других асинхронных функций IndexedDB делает то же самое — возвращает объект IDBRequest  с результатом или ошибкой. Результат функции open всегда возвращает экземпляр объекта IDBDatabase.

Второй параметр метода open — это версия базы данных. Версия определяет схему базы данных — хранилище объектов  и их структуру . Если база данных ещё не существует, то она создаётся операцией open, затем срабатывает триггер события onupgradeneeded и после этого  ваш обработчик этого события создаёт схему базы данных. Если же база данных уже существует, а вы указываете новый номер версии, то сразу же срабатывает триггер события onupgradeneeded, позволяя вам обновить схему базы данных в обработчике. Подробнее об этом см. в Обновление версии базы данных ниже и на странице IDBFactory.open (en-US) справочника

Версия базы данных имеет внутреннее представление unsigned long long number (длинное длинное целое без знака), то есть может принимать очень большие целые значения. Имейте в виду также, что нет смысла использовать в качестве версии базы данных значение с плавающей точкой (float), потому что оно будет сконвертировано в ближайшее меньшее целое. В результате неожиданно может не запуститься транзакция или сработать триггер события upgradeneeded. Например, не используйте значение  2.4 как версию базы данных:

var request = indexedDB.open("MyTestDatabase", 2.4); 
Установка обработчиков

Первое, что понадобится сделать практически со всеми запросами, которые вы создаёте — это добавить обработчики событий успеха и ошибки:

request.onerror = function(event) {
  
};
request.onsuccess = function(event) {
  
};

Какая из двух функций - onsuccess() или onerror() — должна быть вызвана?  Если всё в порядке — то инициируется событие успеха (это событие DOM,  свойство type которого выставлено в "success")  с request в качестве target. Это вызывает запуск  функции onsuccess() объекта request  с событием успеха в качестве аргумента. В противном случае, если возникают какие-то проблемы, то происходит событие ошибки (то есть событие DOM, свойство type которого установлено в  "error") . Это приводит к запуску  функции onerror() с событием ошибки в качестве аргумента.

IndexedDB API разработан так, чтобы минимизировать необходимость обработки ошибок, поэтому скорее всего вы не встретите много событий ошибки запроса (по крайней мере если вы будете использовать этот API!). Однако при открытии базы данных есть несколько общих условий, которые генерируют события ошибок. Наиболее вероятной проблемой является запрет вашему веб-приложению на создание базы данных, установленный пользователем в браузере. Одной из основных целей разработки IndexedDB — это обеспечение возможности сохранения больших объёмов данных для использования офлайн. (Чтобы узнать,  сколько памяти вы можете использовать в разных браузерах, обратитесь к Ограничениям памяти).

Конечно же, браузеры стремятся не позволить назойливым рекламным сетям или вредоносным сайтам засорять ваш компьютер. Поэтому при первой попытке любого веб-приложения открыть хранилище IndexedDB, браузер запрашивает разрешение пользователя. Пользователь может выбрать — то ли разрешить, то ли запретить доступ. Кроме этого, в приватных режимах браузеров (частный просмотр для Firefox и режим инкогнито для Chrome), IndexedDB полностью запрещена для использования. Так как цель приватных режимов — не оставлять следов, то открытие базы данных невозможно в таких режимах.

А теперь предположим, что пользователь разрешил вашему запросу создать базу данных и состоялось событие успеха, запустившее обработчик события успеха. Что дальше? Так как ваш запрос был сгенерирован с вызовом метода indexedDB.open(), то request.result   является экземпляром объекта IDBDatabase и вы определённо захотите сохранить его для будущего использования. Ваш код может выглядеть примерно так:

var db;
var request = indexedDB.open("MyTestDatabase");
request.onerror = function(event) {
  alert("Почему вы не позволяете моему веб-приложению использовать IndexedDB?!");
};
request.onsuccess = function(event) {
  db = event.target.result;
};
Обработка ошибок

Как уже упоминалось выше, события ошибки всплывают. Событие ошибки нацелено (в фазе перехвата) на запрос, который сгенерировал ошибку, затем событие всплывает до уровня транзакции и наконец достигает уровня объекта базы данных. Если вы хотите избежать установки отдельных обработчиков на каждый запрос, то вы можете вместо этого установить один единственный обработчик на объект базы данных, например так:

db.onerror = function(event) {
  
  alert("Database error: " + event.target.errorCode);
};

Одной из возможных ошибок при открытии базы данных является VER_ERR. Она сигнализирует о том, что версия базы данных, сохранённая на диске, больше, чем версия, которую вы пытаетесь открыть. Такая ошибка должна быть в обязательном порядке обработана обработчиком ошибок. 

Создание или обновление версии базы данных

Когда вы создаёте новую базу данных или увеличиваете номер версии существующей базы данных (задавая больший номер версии, чем тот номер, который был вами указан при Opening a database) запускается событие onupgradeneeded. В обработчике этого события вы должны создать хранилище объектов, необходимое для этой версии базы данных:


request.onupgradeneeded = function(event) {
  var db = event.target.result;

  
  var objectStore = db.createObjectStore("name", { keyPath: "myKey" });
};

Версия числа без знака с длиной long long, может быть очень большим.

Так же вы не можете использовать float, его значение будет округлено до ближайшего целого, со всеми вытекающими из этого ошибками:

var request = indexedDB.open("MyTestDatabase", 2.4); 

Когда вы увеличиваете номер версии, будет инициировано событие onupgradeneeded. В этот момент БД будет хранить старые объекты. Но для всякого объекта прошлой версии стоит создать новый объект, совместимый с новой версией. Если вам необходимо исправить существующий объект в БД (например, для изменения keyPath), то вы можете удалить объект и создать его вновь с новыми параметрами (помните, что удаление стирает информацию, так что не забывайте сохранять то, что вам нужно).

WebKit поддерживает текущую версию спецификации в Google Chrome 23 и старше. Так что там нет события indexedDB.open(name, version).onupgradeneeded. Однако, вы можете ознакомиться с инструкцией о том, что делать со старым Webkit.

Структура базы данных

Now to structure the database. IndexedDB uses object stores rather than tables, and a single database can contain any number of object stores. Whenever a value is stored in an object store, it is associated with a key. There are several different ways that a key can be supplied depending on whether the object store uses a key path or a key generator.

The following table shows the different ways the keys are supplied. 

Key PathKey GeneratorDescription
NoNoThis object store can hold any kind of value, even primitive values like numbers and strings. You must supply a separate key argument whenever you want to add a new value.
YesNoThis object store can only hold JavaScript objects. The objects must have a property with the same name as the key path.
NoYesThis object store can hold any kind of value. The key is generated for you automatically, or you can supply a separate key argument if you want to use a specific key.
YesYesThis object store can only hold JavaScript objects. Usually a key is generated and the value of the generated key is stored in the object in a property with the same name as the key path. However, if such a property already exists, the value of that property is used as key rather than generating a new key.

You can also create indices on any object store, provided the object store holds objects, not primitives. An index lets you look up the values stored in an object store using the value of a property of the stored object, rather than the object’s key.

Additionally, indexes have the ability to enforce simple constraints on the stored data. By setting the unique flag when creating the index, the index ensures that no two objects are stored with both having the same value for the index’s key path. So, for example, if you have an object store which holds a set of people, and you want to ensure that no two people have the same email address, you can use an index with the unique flag set to enforce this.

That may sound confusing, but this simple example should illustrate the concepts:


const customerData = [
  { ssn: "444-44-4444", name: "Bill", age: 35, email: "[email protected]" },
  { ssn: "555-55-5555", name: "Donna", age: 32, email: "[email protected]" }
];
const dbName = "the_name";

var request = indexedDB.open(dbName, 2);

request.onerror = function(event) {
  
};
request.onupgradeneeded = function(event) {
  var db = event.target.result;

  
  
  
  var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });

  
  
  objectStore.createIndex("name", "name", { unique: false });

  
  
  objectStore.createIndex("email", "email", { unique: true });

  
  for (var i in customerData) {
    objectStore.add(customerData[i]);
  }
};

As mentioned previously, onupgradeneeded is the only place where you can alter the structure of the database. In it, you can create and delete object stores and build and remove indices.

Object stores are created with a single call to createObjectStore(). The method takes a name of the store, and a parameter object. Even though the parameter object is optional, it is very important, because it lets you define important optional properties and refine the type of object store you want to create. In our case, we’ve asked for an object store named «customers» and  defined a keyPath that is the property that makes an individual object in the store unique. That property in this example is «ssn» since a social security number is guaranteed to be unique. «ssn» must be present on every object that is stored in the objectStore. 

We’ve also asked for an index named «name» that looks at the name property of the stored objects. As with createObjectStore(), createIndex() takes an optional options object that refines the type of  index that you want to create. Adding objects that don’t have a name property still succeeds, but the object won’t appear in the «name» index.

We can now retrieve the stored customer objects using their ssn from the object store directly, or using their name by using the index. To learn how this is done, see the section on using an index.

Before you can do anything with your new database, you need to start a transaction. Transactions come from the database object, and you have to specify which object stores you want the transaction to span. Also, you need to decide if you’re going to make changes to the database or if you just need to read from it.  Although transactions have three modes (read-only, read/write, and versionchange), you’re better off using a read-only transaction when you can, because they can run concurrently

Adding data to the database

If you’ve just created a database, then you probably want to write to it. Here’s what that looks like:

var transaction = db.transaction(["customers"], "readwrite");


The transaction() function takes two arguments (though one is optional) and returns a transaction object. The first argument is a list of object stores that the transaction will span. You can pass an empty array if you want the transaction to span all object stores, but don’t do it because the spec says an empty array should generate an InvalidAccessError. If you don’t specify anything for the second argument, you get a read-only transaction. Since you want to write to it here you need to pass the "readwrite" flag.

Now that you have a transaction you need to understand its lifetime. Transactions are tied very closely to the event loop. If you make a transaction and return to the event loop without using it then the transaction will become inactive. The only way to keep the transaction active is to make a request on it. When the request is finished you’ll get a DOM event and, assuming that the request succeeded, you’ll have another opportunity to extend the transaction during that callback. If you return to the event loop without extending the transaction then it will become inactive, and so on. As long as there are pending requests the transaction remains active. Transaction lifetimes are really very simple but it might take a little time to get used to. A few more examples will help, too. If you start seeing TRANSACTION_INACTIVE_ERR error codes then you’ve messed something up.

Transactions can receive DOM events of three different types: error, abort, and complete. We’ve talked about the way that error events bubble, so a transaction  receives error events from any requests that are generated from it. A more subtle point here is that the default behavior of an error is to abort the transaction in which it occurred. Unless you handle the error by calling preventDefault() on the error event, the entire transaction is rolled back. This design forces you to  think about and handle errors, but you can always add a catchall error handler to the database if fine grained error handling is too cumbersome. If you don’t handle an error event or if you call abort() on the transaction, then the transaction is rolled back and an abort event is fired on the transaction. Otherwise, after all pending requests have completed, you’ll get a complete event. If you’re doing lots of database operations, then tracking the transaction rather than individual requests can certainly aide your sanity.

Now that you have a transaction, you’ll need to get the object store from it. Transactions only let you have an object store that you specified when creating the transaction. Then you can add all the data you need.


transaction.oncomplete = function(event) {
  alert("All done!");
};

transaction.onerror = function(event) {
  
};

var objectStore = transaction.objectStore("customers");
for (var i in customerData) {
  var request = objectStore.add(customerData[i]);
  request.onsuccess = function(event) {
    
  };
}

The result of a request generated from a call to add() is the key of the value that was added. So in this case, it should equal the ssn property of the object that was added, since the object store uses the ssn property for the key path. Note that the add() function requires that no object already be in the database with the same key. If you’re trying to modify an existing entry, or you don’t care if one exists already, use the put() function.

Removing data is very similar:

var request = db.transaction(["customers"], "readwrite")
                .objectStore("customers")
                .delete("444-44-4444");
request.onsuccess = function(event) {
  
};

Now that the database has some info in it, you can retrieve it in several ways. First, the simple get(). You need to provide the key to retrieve the value, like so:

var transaction = db.transaction(["customers"]);
var objectStore = transaction.objectStore("customers");
var request = objectStore.get("444-44-4444");
request.onerror = function(event) {
  
};
request.onsuccess = function(event) {
  
  alert("Name for SSN 444-44-4444 is " + request.result.name);
};

That’s a lot of code for a «simple» retrieval. Here’s how you can shorten it up a bit, assuming that you handle errors at the database level:

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
  alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};

See how this works? Since there’s only one object store, you can avoid passing a list of object stores you need in your transaction and just pass the name as a string. Also, you’re only reading from the database, so you don’t need a "readwrite" transaction. Calling transaction() with no mode specified gives you a "readonly" transaction. Another subtlety here is that you don’t actually save the request object to a variable. Since the DOM event has the request as its target you can use the event to get to the result property. Easy, right?!

Using get() requires that you know which key you want to retrieve. If you want to step through all the values in your object store, then you can use a cursor. Here’s what it looks like:

var objectStore = db.transaction("customers").objectStore("customers");

objectStore.openCursor().onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    alert("Name for SSN " + cursor.key + " is " + cursor.value.name);
    cursor.continue();
  }
  else {
    alert("No more entries!");
  }
};

The openCursor() function takes several arguments. First, you can limit the range of items that are retrieved by using a key range object that we’ll get to in a minute. Second, you can specify the direction that you want to iterate. In the above example, we’re iterating over all objects in ascending order. The success callback for cursors is a little special. The cursor object itself is the result of the request (above we’re using the shorthand, so it’s event.target.result). Then the actual key and value can be found on the key and value properties of the cursor object. If you want to keep going, then you have to call continue() on the cursor. When you’ve reached the end of the data (or if there were no entries that matched your openCursor() request) you still get a success callback, but the result property is undefined.

One common pattern with cursors is to retrieve all objects in an object store and add them to an array, like this:

var customers = [];

objectStore.openCursor().onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    customers.push(cursor.value);
    cursor.continue();
  }
  else {
    alert("Got all customers: " + customers);
  }
};

Warning: The following function is not part of the IndexedDB standard!

Mozilla has also implemented getAll() to handle this case. It isn’t part of the IndexedDB standard, so it may disappear in the future. We’ve included it because we think it’s useful. The following code does precisely the same thing as above:

objectStore.getAll().onsuccess = function(event) {
  alert("Got all customers: " + event.target.result);
};

There is a performance cost associated with looking at the value property of a cursor, because the object is created lazily. When you use getAll(), Gecko must create all the objects at once. If you’re just interested in looking at each of the keys, for instance, it is much more efficient to use a cursor than to use getAll(). If you’re trying to get an array of all the objects in an object store, though, use getAll().

Using an index

Storing customer data using the SSN as a key is logical since the SSN uniquely identifies an individual. (Whether this is a good idea for privacy is a different question, outside the scope of this article.) If you need to look up a customer by name, however, you’ll need to iterate over every SSN in the database until you find the right one. Searching in this fashion would be very slow, so instead you can use an index.

var index = objectStore.index("name");
index.get("Donna").onsuccess = function(event) {
  alert("Donna's SSN is " + event.target.result.ssn);
};

The «name» cursor isn’t unique, so there could be more than one entry with the name set to "Donna". In that case you always get the one with the lowest key value.

If you need to access all the entries with a given name you can use a cursor. You can open two different types of cursors on indexes. A normal cursor maps the index property to the object in the object store. A key cursor maps the index property to the key used to store the object in the object store. The differences are illustrated here:

index.openCursor().onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    
    alert("Name: " + cursor.key + ", SSN: " + cursor.value.ssn + ", email: " + cursor.value.email);
    cursor.continue();
  }
};

index.openKeyCursor().onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    
    
    alert("Name: " + cursor.key + ", SSN: " + cursor.value);
    cursor.continue();
  }
};

Specifying the range and direction of cursors

If you would like to limit the range of values you see in a cursor, you can use a key range object and pass it as the first argument to openCursor() or openKeyCursor(). You can make a key range that only allows a single key, or one the has a lower or upper bound, or one that has both a lower and upper bound. The bound may be «closed» (i.e., the key range includes the given value) or «open» (i.e., the key range does not include the given value). Here’s how it works:


var singleKeyRange = IDBKeyRange.only("Donna");


var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill");


var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true);


var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true);


var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true);

index.openCursor(boundKeyRange).onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    
    cursor.continue();
  }
};

Sometimes you may want to iterate in descending order rather than in ascending order (the default direction for all cursors). Switching direction is accomplished by passing prev to the openCursor() function:

objectStore.openCursor(null, IDBCursor.prev).onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    
    cursor.continue();
  }
};

Since the «name» index isn’t unique, there might be multiple entries where name is the same. Note that such a situation cannot occur with object stores since the key must always be unique. If you wish to filter out duplicates during cursor iteration over indexes, you can pass nextunique (or prevunique if you’re going backwards) as the direction parameter. When nextunique or prevunique is used, the entry with the lowest key is always the one returned.

index.openKeyCursor(null, IDBCursor.nextunique).onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    
    cursor.continue();
  }
};

When your web app changes in such a way that a version change is required for your database, you need to consider what happens if the user has the old version of your app open in one tab and then loads the new version of your app in another. When you call open() with a greater version than the actual version of the database, all other open databases must explicitly acknowledge the request before you can start making changes to the database. Here’s how it works:

var openReq = mozIndexedDB.open("MyTestDatabase", 2);

openReq.onblocked = function(event) {
  
  
  alert("Please close all other tabs with this site open!");
};

openReq.onupgradeneeded = function(event) {
  
  db.createObjectStore();
  useDatabase(db);
}

openReq.onsuccess = function(event) {
  var db = event.target.result;
  useDatabase(db);
  return;
}

function useDatabase(db) {
  
  
  
  db.onversionchange = function(event) {
    db.close();
    alert("A new version of this page is ready. Please reload!");
  };

  
}

IndexedDB uses the same-origin principle, which means that it ties the store to the origin of the site that creates it (typically, this is the site domain or subdomain), so it cannot be accessed by any other origin.

It’s important to note that IndexedDB doesn’t work for content loaded into a frame from another site (either <frame> (en-US) or <iframe> (en-US). This is a security and privacy measure and can be considered analogous the blocking of 3rd-party cookies.  For more details, see баг 595307.

When the browser shuts down (e.g., when the user selects Exit or clicks the Close button),  any pending IndexedDB transactions are (silently) aborted — they will not complete, and they will not trigger the error handler.  Since the user can exit the browser at any time, this means that you cannot rely upon any particular transaction to complete or to know that it did not complete.  There are several implications of this behavior.

First, you should take care to always leave your database in a consistent state at the end of every transaction.  For example, suppose that you are using IndexedDB to store a list of items that you allow the user to edit.  You save the list after the edit by clearing the object store and then writing out the new list.  If you clear the object store in one transaction and write the new list in another transaction, there is a danger that the browser will close after the clear but before the write, leaving you with an empty database.  To avoid this, you should combine the clear and the write into a single transaction. 

Second, you should never tie database transactions to unload events.  If the unload event is triggered by the browser closing, any transactions created in the unload event handler will never complete.  An intuitive approach to maintaining some information across browser sessions is to read it from the database when the browser (or a particular page) is opened, update it as the user interacts with the browser, and then save it to the database when the browser (or page) closes.  However, this will not work.  The database transactions will be created in the unload event handler, but because they are asynchronous they will be aborted before they can execute.

In fact, there is no way to guarantee that IndexedDB transactions will complete, even with normal browser shutdown.  See баг 870645.

HTML Content

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

    <h2>IndexedDB Demo: storing blobs, e-publication example</h2>
    <div>
      <p>
        Works and tested with:
      </p>
      <div>
      </div>
    </div>

    <div>
    </div>

    <form>
      <table>
        <tbody>
          <tr>
            <td>
              <label for="pub-title">
                Title:
              </label>
            </td>
            <td>
              <input type="text" name="pub-title" />
            </td>
          </tr>
          <tr>
            <td>
              <label for="pub-biblioid">
                Bibliographic ID:<br/>
                <span>(ISBN, ISSN, etc.)</span>
              </label>
            </td>
            <td>
              <input type="text" name="pub-biblioid"/>
            </td>
          </tr>
          <tr>
            <td>
              <label for="pub-year">
                Year:
              </label>
            </td>
            <td>
              <input type="number" name="pub-year" />
            </td>
          </tr>
        </tbody>
        <tbody>
          <tr>
            <td>
              <label for="pub-file">
                File image:
              </label>
            </td>
            <td>
              <input type="file"/>
            </td>
          </tr>
          <tr>
            <td>
              <label for="pub-file-url">
                Online-file image URL:<br/>
                <span>(same origin URL)</span>
              </label>
            </td>
            <td>
              <input type="text" name="pub-file-url"/>
            </td>
          </tr>
        </tbody>
      </table>

      <div>
        <input type="button" value="Add Publication" />
        <input type="reset"/>
      </div>
    </form>

    <form>
      <table>
        <tbody>
          <tr>
            <td>
              <label for="pub-biblioid-to-delete">
                Bibliographic ID:<br/>
                <span>(ISBN, ISSN, etc.)</span>
              </label>
            </td>
            <td>
              <input type="text"
                     name="pub-biblioid-to-delete" />
            </td>
          </tr>
          <tr>
            <td>
              <label for="key-to-delete">
                Key:<br/>
                <span>(for example 1, 2, 3, etc.)</span>
              </label>
            </td>
            <td>
              <input type="text"
                     name="key-to-delete" />
            </td>
          </tr>
        </tbody>
      </table>
      <div>
        <input type="button" value="Delete Publication" />
        <input type="button"
               value="Clear the whole store" />
      </div>
    </form>

    <form>
      <div>
        <input type="button"
               value="List database content" />
      </div>
    </form>

    <div>
      <div>
      </div>
      <div>
      </div>
      <ul>
      </ul>
    </div>

CSS Content

body {
  font-size: 0.8em;
  font-family: Sans-Serif;
}

form {
  background-color: #cccccc;
  border-radius: 0.3em;
  display: inline-block;
  margin-bottom: 0.5em;
  padding: 1em;
}

table {
  border-collapse: collapse;
}

input {
  padding: 0.3em;
  border-color: #cccccc;
  border-radius: 0.3em;
}

.required:after {
  content: "*";
  color: red;
}

.button-pane {
  margin-top: 1em;
}

#pub-viewer {
  float: right;
  width: 48%;
  height: 20em;
  border: solid #d092ff 0.1em;
}
#pub-viewer iframe {
  width: 100%;
  height: 100%;
}

#pub-list {
  width: 46%;
  background-color: #eeeeee;
  border-radius: 0.3em;
}
#pub-list li {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  padding-right: 0.5em;
}

#msg {
  margin-bottom: 1em;
}

.action-success {
  padding: 0.5em;
  color: #00d21e;
  background-color: #eeeeee;
  border-radius: 0.2em;
}

.action-failure {
  padding: 0.5em;
  color: #ff1408;
  background-color: #eeeeee;
  border-radius: 0.2em;
}

.note {
  font-size: smaller;
}

.destructive {
  background-color: orange;
}
.destructive:hover {
  background-color: #ff8000;
}
.destructive:active {
  background-color: red;
}

 

JavaScript Content

(function () {
  var COMPAT_ENVS = [
    ['Firefox', ">= 16.0"],
    ['Google Chrome',
     ">= 24.0 (you may need to get Google Chrome Canary), NO Blob storage support"]
  ];
  var compat = $('#compat');
  compat.empty();
  compat.append('<ul></ul>');
  COMPAT_ENVS.forEach(function(val, idx, array) {
    $('#compat-list').append('<li>' + val[0] + ': ' + val[1] + '</li>');
  });

  const DB_NAME = 'mdn-demo-indexeddb-epublications';
  const DB_VERSION = 1; 
  const DB_STORE_NAME = 'publications';

  var db;

  
  var current_view_pub_key;

  function openDb() {
    console.log("openDb ...");
    var req = indexedDB.open(DB_NAME, DB_VERSION);
    req.onsuccess = function (evt) {
      
      
      
      db = this.result;
      console.log("openDb DONE");
    };
    req.onerror = function (evt) {
      console.error("openDb:", evt.target.errorCode);
    };

    req.onupgradeneeded = function (evt) {
     console.log("openDb.onupgradeneeded");
     var thisDB = evt.target.result;
     if (!thisDB.objectStoreNames.contains(DB_STORE_NAME)) {
      var store = thisDB.createObjectStore(
          DB_STORE_NAME, { keyPath: 'id', autoIncrement: true });

        store.createIndex('biblioid', 'biblioid', { unique: true });
        store.createIndex('title', 'title', { unique: false });
        store.createIndex('year', 'year', { unique: false });
      }
    };
  }

  
  function getObjectStore(store_name, mode) {
    var tx = db.transaction(store_name, mode);
    return tx.objectStore(store_name);
  }

  function clearObjectStore(store_name) {
    var store = getObjectStore(DB_STORE_NAME, 'readwrite');
    var req = store.clear();
    req.onsuccess = function(evt) {
      displayActionSuccess("Store cleared");
      displayPubList(store);
    };
    req.onerror = function (evt) {
      console.error("clearObjectStore:", evt.target.errorCode);
      displayActionFailure(this.error);
    };
  }

  function getBlob(key, store, success_callback) {
    var req = store.get(key);
    req.onsuccess = function(evt) {
      var value = evt.target.result;
      if (value)
        success_callback(value.blob);
    };
  }

  
  function displayPubList(store) {
    console.log("displayPubList");

    if (typeof store == 'undefined')
      store = getObjectStore(DB_STORE_NAME, 'readonly');

    var pub_msg = $('#pub-msg');
    pub_msg.empty();
    var pub_list = $('#pub-list');
    pub_list.empty();
    
    newViewerFrame();

    var req;
    req = store.count();
    
    
    
    
    req.onsuccess = function(evt) {
      pub_msg.append('<p>There are <strong>' + evt.target.result +
                     '</strong> record(s) in the object store.</p>');
    };
    req.onerror = function(evt) {
      console.error("add error", this.error);
      displayActionFailure(this.error);
    };

    var i = 0;
    req = store.openCursor();
    req.onsuccess = function(evt) {
      var cursor = evt.target.result;

      
      if (cursor) {
        console.log("displayPubList cursor:", cursor);
        req = store.get(cursor.key);
        req.onsuccess = function (evt) {
          var value = evt.target.result;
          var list_item = $('<li>' +
                            '[' + cursor.key + '] ' +
                            '(biblioid: ' + value.biblioid + ') ' +
                            value.title +
                            '</li>');
          if (value.year != null)
            list_item.append(' - ' + value.year);

          if (value.hasOwnProperty('blob') &&
              typeof value.blob != 'undefined') {
            var link = $('<a href="' + cursor.key + '">File</a>');
            link.on('click', function() { return false; });
            link.on('mouseenter', function(evt) {
                      setInViewer(evt.target.getAttribute('href')); });
            list_item.append(' / ');
            list_item.append(link);
          } else {
            list_item.append(" / No attached file");
          }
          pub_list.append(list_item);
        };

        
        cursor.continue();

        
        i++;
      } else {
        console.log("No more entries");
      }
    };
  }

  function newViewerFrame() {
    var viewer = $('#pub-viewer');
    viewer.empty();
    var iframe = $('<iframe />');
    viewer.append(iframe);
    return iframe;
  }

  function setInViewer(key) {
    console.log("setInViewer:", arguments);
    key = Number(key);
    if (key == current_view_pub_key)
      return;

    current_view_pub_key = key;

    var store = getObjectStore(DB_STORE_NAME, 'readonly');
    getBlob(key, store, function(blob) {
      console.log("setInViewer blob:", blob);
      var iframe = newViewerFrame();

      
      
      if (blob.type == 'text/html') {
        var reader = new FileReader();
        reader.onload = (function(evt) {
          var html = evt.target.result;
          iframe.load(function() {
            $(this).contents().find('html').html(html);
          });
        });
        reader.readAsText(blob);
      } else if (blob.type.indexOf('image/') == 0) {
        iframe.load(function() {
          var img_id = 'image-' + key;
          var img = $('<img/>');
          $(this).contents().find('body').html(img);
          var obj_url = window.URL.createObjectURL(blob);
          $(this).contents().find('#' + img_id).attr('src', obj_url);
          window.URL.revokeObjectURL(obj_url);
        });
      } else if (blob.type == 'application/pdf') {
        $('*').css('cursor', 'wait');
        var obj_url = window.URL.createObjectURL(blob);
        iframe.load(function() {
          $('*').css('cursor', 'auto');
        });
        iframe.attr('src', obj_url);
        window.URL.revokeObjectURL(obj_url);
      } else {
        iframe.load(function() {
          $(this).contents().find('body').html("No view available");
        });
      }

    });
  }

  
  function addPublicationFromUrl(biblioid, title, year, url) {
    console.log("addPublicationFromUrl:", arguments);

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    
    
    xhr.responseType = 'blob';
    xhr.onload = function (evt) {
                           if (xhr.status == 200) {
                             console.log("Blob retrieved");
                             var blob = xhr.response;
                             console.log("Blob:", blob);
                             addPublication(biblioid, title, year, blob);
                           } else {
                             console.error("addPublicationFromUrl error:",
                                           xhr.responseText, xhr.status);
                           }
                         };
    xhr.send();

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  }

  
  function addPublication(biblioid, title, year, blob) {
    console.log("addPublication arguments:", arguments);
    var obj = { biblioid: biblioid, title: title, year: year };
    if (typeof blob != 'undefined')
      obj.blob = blob;

    var store = getObjectStore(DB_STORE_NAME, 'readwrite');
    var req;
    try {
      req = store.add(obj);
    } catch (e) {
      if (e.name == 'DataCloneError')
        displayActionFailure("This engine doesn't know how to clone a Blob, " +
                             "use Firefox");
      throw e;
    }
    req.onsuccess = function (evt) {
      console.log("Insertion in DB successful");
      displayActionSuccess();
      displayPubList(store);
    };
    req.onerror = function() {
      console.error("addPublication error", this.error);
      displayActionFailure(this.error);
    };
  }

  
  function deletePublicationFromBib(biblioid) {
    console.log("deletePublication:", arguments);
    var store = getObjectStore(DB_STORE_NAME, 'readwrite');
    var req = store.index('biblioid');
    req.get(biblioid).onsuccess = function(evt) {
      if (typeof evt.target.result == 'undefined') {
        displayActionFailure("No matching record found");
        return;
      }
      deletePublication(evt.target.result.id, store);
    };
    req.onerror = function (evt) {
      console.error("deletePublicationFromBib:", evt.target.errorCode);
    };
  }

  
  function deletePublication(key, store) {
    console.log("deletePublication:", arguments);

    if (typeof store == 'undefined')
      store = getObjectStore(DB_STORE_NAME, 'readwrite');

    
    
    
    
    var req = store.get(key);
    req.onsuccess = function(evt) {
      var record = evt.target.result;
      console.log("record:", record);
      if (typeof record == 'undefined') {
        displayActionFailure("No matching record found");
        return;
      }
      
      
      
      req = store.delete(key);
      req.onsuccess = function(evt) {
        console.log("evt:", evt);
        console.log("evt.target:", evt.target);
        console.log("evt.target.result:", evt.target.result);
        console.log("delete successful");
        displayActionSuccess("Deletion successful");
        displayPubList(store);
      };
      req.onerror = function (evt) {
        console.error("deletePublication:", evt.target.errorCode);
      };
    };
    req.onerror = function (evt) {
      console.error("deletePublication:", evt.target.errorCode);
      };
  }

  function displayActionSuccess(msg) {
    msg = typeof msg != 'undefined' ? "Success: " + msg : "Success";
    $('#msg').html('<span>' + msg + '</span>');
  }
  function displayActionFailure(msg) {
    msg = typeof msg != 'undefined' ? "Failure: " + msg : "Failure";
    $('#msg').html('<span>' + msg + '</span>');
  }
  function resetActionStatus() {
    console.log("resetActionStatus ...");
    $('#msg').empty();
    console.log("resetActionStatus DONE");
  }

  function addEventListeners() {
    console.log("addEventListeners");

    $('#register-form-reset').click(function(evt) {
      resetActionStatus();
    });

    $('#add-button').click(function(evt) {
      console.log("add ...");
      var title = $('#pub-title').val();
      var biblioid = $('#pub-biblioid').val();
      if (!title || !biblioid) {
        displayActionFailure("Required field(s) missing");
        return;
      }
      var year = $('#pub-year').val();
      if (year != '') {
        
        if (isNaN(year))  {
          displayActionFailure("Invalid year");
          return;
        }
        year = Number(year);
      } else {
        year = null;
      }

      var file_input = $('#pub-file');
      var selected_file = file_input.get(0).files[0];
      console.log("selected_file:", selected_file);
      
      
      
      
      var file_url = $('#pub-file-url').val();
      if (selected_file) {
        addPublication(biblioid, title, year, selected_file);
      } else if (file_url) {
        addPublicationFromUrl(biblioid, title, year, file_url);
      } else {
        addPublication(biblioid, title, year);
      }

    });

    $('#delete-button').click(function(evt) {
      console.log("delete ...");
      var biblioid = $('#pub-biblioid-to-delete').val();
      var key = $('#key-to-delete').val();

      if (biblioid != '') {
        deletePublicationFromBib(biblioid);
      } else if (key != '') {
        
        if (key == '' || isNaN(key))  {
          displayActionFailure("Invalid key");
          return;
        }
        key = Number(key);
        deletePublication(key);
      }
    });

    $('#clear-store-button').click(function(evt) {
      clearObjectStore();
    });

    var search_button = $('#search-list-button');
    search_button.click(function(evt) {
      displayPubList();
    });

  }

  openDb();
  addEventListeners();

})(); 

Test the online live demo

If you want to start tinkering with the API, jump in to the reference documentation and checking out the different methods.

Reference

Tutorials

Related articles

Firefox

Информационные блоки:Для разработчиков

Компоненты модуля
НазваниеИмя в пространстве имен bitrixОписание
Новости
Новости (комплексный компонент)newsПозволяет создать новостной раздел на сайте.
Календарьnews.calendarСлужит для формирования и вывода календаря новостей или событий.
Новость детальноnews.detailОсуществляет вывод детального описания новости.
Все новостиnews.indexВыводит новости из различных инфоблоков.
Лентаnews.lineОсуществляет вывод списка элементов инфоблоков с датой и заголовком со ссылкой на страницу с подробной информацией.
Список новостейnews.listВыводит список новостей из одного информационного блока.
Фотогалерея
Фотогалерея (комплексный компонент)photoПозволяет получить полнофункциональную фотогалерею, создавая физически только одну страницу.
Фотография детальноphoto.detailВыводит детальную информацию по фотографии.
Случайное фотоphoto.randomСлужит для показа одной произвольной фотографии.
Фотографии разделаphoto.sectionВыводит все фотографии из выбранного раздела.
Разделы с TOP’ом фотографийphoto.sections.topСлужит для вывода TOP’а фотографий, сгруппированных по разделам.
Фотогалерея 2.0
Фотогалерея 2.0 (комплексный компонент)photogalleryПозволяет получить полнофункциональную фотогалерею, создавая физически только одну страницу.
Фотоphotogallery.detailВыводит детальную информацию по фотографии.
Фото (комментарии)photogallery.detail.commentСлужит для создания комментариев к фотографии.
Фото (редактирование)photogallery.detail.editСлужит для редактирования свойств фотографии.
Фото (список)photogallery.detail.listВыводит список фотографий.
Список фото со слайдеромphotogallery.detail.list.exВыводит список фотографий во всплывающем окне со слайдером и комментариями.
Фотогалерея (редактирование)photogallery.gallery.editВыводит форму редактирования параметров фотогалереи пользователя.
Фотогалерея (список)photogallery.gallery.listВыводит список фотогалерей пользователя.
Фотогалерея (шаблоны)photogallery.interfaceПодключает библиотеку вспомогательных шаблонов. Компонент ничего не выводит.
Flash-слайдшоу (Не поддерживается с версии 15.0.0)photogallery.imagerotatorЦиклически проигрывает фотографии из фотогалереи.
Альбомphotogallery.sectionВыводит полную информацию об одном альбоме.
Альбом (редактирование)photogallery.section.editПозволяет отредактировать данные альбома: изменить название, дату создания, ввести описание, ограничить доступ к альбому по паролю.
Альбом (редактирование обложки)photogallery.section.edit.iconСлужит для редактирования обложки альбома.
Альбом (список)photogallery.section.listВыводит список альбомов с информацией о количестве фотографий, вложенных альбомов в каждом и ссылками на просмотр содержимого альбомов.
Фото (загрузка)photogallery.uploadСлужит для загрузки фотографии.
Панельphotogallery.userВыводит информацию о галерее пользователя.
Фотогалерея 2.0 (многопользовательская) (комплексный компонент)photogallery_userПозволяет получить полнофункциональную многопользовательскую фотогалерею, создавая физически только одну страницу.
Каталог
Каталог (комплексный компонент)catalogОсуществляет вывод полного каталога товаров из определенного инфоблока.
Список сравниваемых элементов каталогаcatalog.compare.listВыводит список сравниваемых элементов каталога в виде небольшой таблицы.
Таблица сравненияcatalog.compare.resultВыводит таблицу сравниваемых элементов каталога.
Элемент каталога детальноcatalog.elementВыводит детальную информацию по элементу каталога.
Фильтр по элементамcatalog.filterВыводит форму фильтра для фильтрации элементов информационых блоков.
Список связанных элементовcatalog.link.listВыводит список элементов, связанных с заданным.
Список информационных блоков заданного типаcatalog.mainВыводит список всех информационных блоков заданного типа.
Элементы разделаcatalog.sectionВыводит список элементов раздела с указанным набором свойств.
Структура разделовcatalog.section.listВыводит список разделов инфоблока с указанным количеством элементов в каждом разделе.
Разделы с top’ом элементовcatalog.sections.topВыводит Top элементов сгруппированных по разделам; элементы выводятся в таблице.
Top элементов каталогаcatalog.topВыводит в таблице Top элементов из всех разделов в соответствии с заданной сортировкой (используется как правило на главной странице сайта).
RSS
RSS новости (экспорт)rss.outПредназначен для создания страницы, которая отдает выбранные новости вашего сайта в формате RSS.
RSS новости (импорт)rss.showПредназначен для импорта новостей с другого сайта.
Добавление элементов
Добавление элементов инфоблока (комплексный компонент)iblock.element.addОсуществляет вывод списка элементов указанного инфоблока, добавление/редактирование элементов и их удаление в зависимости от прав пользователя.
Форма добавления / редактированияiblock.element.add.formОсуществляет вывод формы создания (редактирования) элемента указанного информационного блока.
Список своих элементовiblock.element.add.listОсуществляет вывод списка доступных пользователю элементов указанного инфоблока, ссылок Добавить, Редактировать, Удалить.
Инфоблоки
Голосованиеiblock.voteРеализует возможность голосования для пользователей.
Универсальные списки
Универсальные спискиlistsПозволяет вести полнофункциональную работу с универсальными списками, создавая физически только одну страницу.
Спискиlists.listsВыводит таблицу универсальных списков, доступных для просмотра и изменения.
Списокlists.listВыводит разделы и элементы универсального списка с возможностью навигации и редактирования.
Разделы спискаlists.sectionsПозволяет удалить и изменить разделы универсального списка.
Редактирование элементаlists.element.editВыводит форму редактирования элемента списка.
Настройки спискаlists.list.editПоказывает форму настроек универсального списка.
Поля спискаlists.fieldsПоказывает поля универсального списка и позволяет их редактировать.
Настройки поля спискаlists.field.editПоказывает форму настройки поля универсального списка.
Навигационная цепочкаlists.element.navchainДобавляет к выводу обычного компонента Навигационная цепочка (bitrix:breadcrumb) элемент списка.

NPS (Индекс потребительской лояльности) — КОММУНИКАЦИИ

NPS (Индекс потребительской лояльности) для оценки работы менеджера клиентом.
Чтобы включить и настроить NPS, нужно перейти в раздел «Настройки» — «Коммуникации». Качество работы с клиентом можно оценить по десятибалльной шкале. Пользователь может выбрать критическую оценку, меньше или равная которой оценка считается неудовлетворительной.

Для настройки понадобится:

  1. Указать текст сообщения, который будет отправлен клиенту при закрытии беседы;
  2. Руководителя, которому будет приходить уведомление в центр уведомлений в случае получения оценки ниже установленной;
  3. Оценка, ниже которой руководитель будет получать уведомление.

При включенном режиме NPS и после закрытия беседы, нажав на номер беседы и выбрав «Закрыть беседу», автоматически отправляется настроенное сообщение от бота с просьбой оценить работу сотрудника. Сообщение приходит клиенту в ту социальную сеть, из которой он писал.
Если клиент поставит оценку меньше или равную критической, то руководителю придет нотификация, даже если он не подписан на карточку (сделки или покупателя, где прикреплен чат). Если клиент поставит оценку выше критической, то Бот отправит сообщение «Спасибо за оценку».

Автоматические сообщения для клиента и руководителя, которые приходят от Бота после оценки работы менеджера клиентом, нельзя редактировать. Текст автоматических сообщений:

  • Сообщение для клиента, если оценка выше установленной критической оценки: «Спасибо за оценку»;
  • Сообщение для клиента, если оценка равна или ниже критической: «Спасибо за оценку, мы сообщим об этом руководителю»;
  • Сообщение для руководителя, если оценка неудовлетворительная: «Клиент оценил качество обслуживания ниже установленного уровня.

Статистика — процентное соотношение оценок клиентов по NPS будет отображена на рабочем столе, для этого нужно добавить соответствующий блок через настройки рабочего стола.

Index API | Руководство по Elasticsearch [7.14]

Вы можете проиндексировать новый документ JSON с помощью ресурса _doc или _create . С использованием _create гарантирует, что документ будет проиндексирован только в том случае, если он еще не существовать. Чтобы обновить существующий документ, необходимо использовать ресурс _doc .

Автоматически создавать потоки данных и индексыправить

Если цель запроса не существует и соответствует шаблон индекса с data_stream По определению, операция индексации автоматически создает поток данных.Видеть Настроить поток данных .

Если цель не существует и не соответствует шаблону потока данных, операция автоматически создает индекс и применяет любое соответствие индексные шаблоны.

Если отображение не существует, операция индексации создает динамическое отображение. По умолчанию новые поля и объекты автоматически добавляется в сопоставление при необходимости. Для получения дополнительной информации о поле сопоставление, см. сопоставление и API сопоставления обновлений.

Автоматическое создание индекса управляется действием .auto_create_index параметр. По умолчанию для этого параметра установлено значение , истинное значение , что позволяет создавать любой индекс. автоматически. Вы можете изменить этот параметр, чтобы явно разрешить или заблокировать автоматическое создание индексов, соответствующих указанным шаблонам, или установка для него false , чтобы полностью отключить автоматическое создание индекса. Укажите список шаблонов, разделенных запятыми, которые вы хотите разрешить, или добавьте к каждому шаблону префикс + или - , чтобы указать, следует ли его разрешить или заблокировать.Когда список указано, поведение по умолчанию — запретить.

Параметр action.auto_create_index влияет только на автоматический создание индексов. Это не влияет на создание потоков данных.

 PUT _cluster / настройки
{
  "настойчивый": {
    "action.auto_create_index": "my-index-000001, index10, -index1 *, + ind *" 
  }
}

PUT _cluster / настройки
{
  "настойчивый": {
    "action.auto_create_index": "false" 
  }
}

PUT _cluster / настройки
{
  "настойчивый": {
    "действие.auto_create_index ":" true "
  }
} 

Разрешить автоматическое создание индексов с именем my-index-000001 или index10 , заблокировать создание индексов, которые соответствуют шаблону index1 * , и позволяют создавать любые другие индексы, соответствующие шаблону ind * . Шаблоны подобраны в заказ указан.

Полностью отключить автоматическое создание индекса.

Разрешить автоматическое создание любого индекса.Это значение по умолчанию.

Ставить при отсутствии

Вы можете принудительно выполнить операцию создания с помощью ресурса _create или установив для параметра op_type значение , создайте . В таком случае, операция индексации не выполняется, если документ с указанным идентификатором уже существует в индексе.

Создавать идентификаторы документов автоматически редактировать

При использовании формата запроса POST / / _doc / используется op_type . автоматически устанавливается на , создает , и операция индекса генерирует уникальный идентификатор для документ.

 ЗАПИСЬ my-index-000001 / _doc /
{
  "@timestamp": "2099-11-15T13: 12: 00",
  "message": "GET / search HTTP / 1.1 200 1070000",
  "Пользователь": {
    "id": "кимчы"
  }
} 

API возвращает следующий результат:

 {
  "_shards": {
    «всего»: 2,
    «не удалось»: 0,
    «успешно»: 2
  },
  "_index": "мой-индекс-000001",
   "_type": "_doc",
  "_id": "W0tpsmIBdwcYyG50zbta",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "результат": "создано"
} 
Оптимистичный контроль параллелизма

Индексные операции могут быть условными и выполняться только в том случае, если последний модификации к документу был присвоен порядковый номер и первичный термин, указанный параметрами if_seq_no и if_primary_term .Если несоответствие обнаружено, операция приведет к VersionConflictException и код состояния 409. Дополнительные сведения см. в разделе Оптимистичное управление параллелизмом.

Маршрутизацияправить

По умолчанию размещение сегментов — или маршрутизация — контролируется с помощью хэш значения идентификатора документа. Для более точного управления значение вводится в хэш-функцию, используемую маршрутизатором, может быть напрямую указан для каждой операции с использованием параметра routing .Например:

 POST my-index-000001 / _doc? Routing = kimchy
{
  "@timestamp": "2099-11-15T13: 12: 00",
  "message": "GET / search HTTP / 1.1 200 1070000",
  "Пользователь": {
    "id": "кимчы"
  }
} 

В этом примере документ направляется в осколок на основе параметр маршрутизации предоставил: «кимчы».

При настройке явного сопоставления можно также использовать поле _routing чтобы направить операцию индекса для извлечения значения маршрутизации из документ.Это происходит за (очень минимальную) стоимость дополнительный проход парсинга документа. Если определено отображение _routing и установлено значение , требуется , операция индекса завершится неудачно, если маршрутизация не выполняется. значение предоставляется или извлекается.

Потоки данных не поддерживают настраиваемую маршрутизацию. Вместо этого нацельтесь на соответствующий индекс поддержки для потока.

Распространяетсяправить

Операция индексации направлена ​​на первичный осколок на основе его маршрута. (см. раздел «Маршрутизация» выше) и выполняется на фактическом узле. содержащий этот осколок.После того, как основной шард завершит операцию, при необходимости обновление распространяется на соответствующие реплики.

Активный осколокправить

Для повышения отказоустойчивости записи в систему операции индексации можно настроить на ожидание определенного количества активных копий шарда прежде чем приступить к операции. Если необходимое количество активных копии осколков недоступны, тогда операция записи должна подождать и повторить попытку, пока не будут запущены необходимые копии сегментов или не истечет время ожидания. имеет место.По умолчанию операции записи ждут только основных шардов. быть активным перед продолжением (т. е. wait_for_active_shards = 1 ). Это значение по умолчанию можно динамически переопределить в настройках индекса. установив index.write.wait_for_active_shards . Чтобы изменить это поведение для каждой операции можно использовать параметр запроса wait_for_active_shards .

Допустимые значения: все или любое положительное целое число вплоть до общего числа. настроенных копий на сегмент в индексе (что составляет число_реплик + 1 ).Указание отрицательного значения или числа, превышающего количество Копии осколков вызовут ошибку.

Например, предположим, что у нас есть кластер из трех узлов: A , B и C и мы создаем индекс , индекс с количеством реплик, равным 3 (в результате 4 копии шарда, на одну копию больше, чем узлов). Если мы попытаться выполнить операцию индексации, по умолчанию операция будет только гарантировать перед продолжением доступна первичная копия каждого осколка.Это означает что даже если B и C выйдут из строя, а на A будут размещены первичные копии шарда, операция индексации по-прежнему будет продолжаться только с одной копией данных. Если wait_for_active_shards установлен в запросе на 3 (и все 3 узла работают), то для операции индексирования потребуется 3 активных копии шарда. прежде, чем продолжить, требование, которое должно быть выполнено, потому что есть 3 активные узлы в кластере, каждый из которых содержит копию осколка.Однако, если мы установим wait_for_active_shards на все (или на 4 , что то же самое), операция индексации не будет продолжена, поскольку у нас нет всех 4 копий каждый шард активен в индексе. Время ожидания операции истечет если в кластере не будет создан новый узел для размещения четвертой копии осколок.

Важно отметить, что этот параметр значительно снижает вероятность операция записи не записывает необходимое количество копий шарда, но это не исключает полностью возможности, потому что эта проверка происходит до начала операции записи.Как только операция записи выполняется, репликация все еще может завершиться неудачно на любом количестве shard копирует, но все равно успешно работает на основном сервере. Раздел _shards Ответ операции записи показывает количество копий осколка, на которых репликация прошла успешно / не удалось.

 {
  "_shards": {
    «всего»: 2,
    «не удалось»: 0,
    «успешно»: 2
  }
} 
Обновить

Указывает, когда изменения, внесенные этим запросом, видны для поиска. Видеть обновить.

Обновления Noopправить

При обновлении документа с помощью index API новая версия документа всегда создается, даже если документ не менялся. Если это неприемлемо используйте API _update с detect_noop , установленным в значение true. Этот вариант не доступный в API индексации, поскольку API индекса не извлекает старый источник и не может сравнить его с новым источником.

Не существует строгого правила о том, когда никакие обновления недопустимы.Это сочетание множества факторов, например, как часто ваш источник данных отправляет обновления, которые на самом деле являются noops и сколько запросов в секунду Elasticsearch работает на шарде, получающем обновления.

Timeoutedit

Первичный сегмент, назначенный для выполнения операции с индексом, может не быть доступен при выполнении операции индексации. Некоторые причины для этого может случиться так, что первичный осколок в настоящее время восстанавливается через шлюз или в процессе переезда. По умолчанию операция индексации будет ждать первичный осколок станет доступным на срок до 1 минуты, прежде чем произойдет сбой и отвечает с ошибкой.Параметр тайм-аут может использоваться для явно укажите, как долго он ждет. Вот пример его настройки до 5 минут:

 PUT my-index-000001 / _doc / 1? Таймаут = 5 мин.
{
  "@timestamp": "2099-11-15T13: 12: 00",
  "message": "GET / search HTTP / 1.1 200 1070000",
  "Пользователь": {
    "id": "кимчы"
  }
} 
Редактирование редакции

Каждому проиндексированному документу присваивается номер версии. По умолчанию, используется внутреннее управление версиями, которое начинается с 1 и увеличивается с каждым обновлением включается удаление.При желании номер версии может быть установлен на внешнее значение (например, если поддерживается в база данных). Чтобы включить эту функцию, для version_type должно быть установлено значение внешний . Предоставленное значение должно быть числовым длинным значением, большим или равным 0, и меньше, чем около 9,2e + 18.

При использовании внешнего типа версии система проверяет, не номер версии, переданный в запрос индекса, больше, чем версия текущего сохраненного документа.Если это правда, документ будет проиндексировано и используется новый номер версии. Если предоставленное значение меньше чем или равно номеру версии сохраненного документа, версия произойдет конфликт, и операция с индексом завершится ошибкой. Например:

 PUT my-index-000001 / _doc / 1? Version = 2 & version_type = external
{
  "Пользователь": {
    "id": "elkbee"
  }
} 

Управление версиями осуществляется полностью в реальном времени, и на него не влияют аспекты поисковых операций в режиме, близком к реальному времени. Если версия не указана, тогда операция выполняется без каких-либо проверок версии.

В предыдущем примере операция завершится успешно, поскольку предоставленный версия 2 выше, чем текущая версия документа 1. Если документ уже был обновлен и его версия была установлена ​​на 2 или выше, команда индексирования завершится ошибкой и приведет к конфликту (код состояния 409 http).

Приятным побочным эффектом является то, что нет необходимости поддерживать строгий порядок. операций асинхронного индексирования, выполняемых в результате изменений в источнике база данных, если используются номера версий из исходной базы данных.Даже простой случай обновления индекса Elasticsearch с использованием данных из база данных упрощается, если используется внешнее управление версиями, так как только последняя версия будет использоваться, если операции с индексами поступают не по порядку для по какой-то причине.

Типы версийправить

В дополнение к типу внешней версии , Elasticsearch также поддерживает другие типы для конкретных случаев использования:

external или external_gt
Индексируйте документ только в том случае, если данная версия строго выше чем версия сохраненного документа или , если документ не существует.Данный версия будет использоваться как новая версия и будет сохранена вместе с новым документом. Поставляемый версия должна быть неотрицательным длинным числом.
external_gte
Индексируйте документ только в том случае, если данная версия равна или выше чем версия сохраненного документа. Если нет существующего документа операция также пройдет успешно. Данная версия будет использоваться как новая версия и будет сохранен с новым документом. Поставляемая версия должна быть неотрицательным длинным числом.

Тип версии external_gte предназначен для особых случаев использования и следует использовать с осторожностью. При неправильном использовании это может привести к потере данных. Есть еще один вариант, force , который устарел, потому что он может вызвать первичный и репликационный сегменты расходятся.

Краткое руководство по API индексирования

| Разработчики Google

Indexing API позволяет любому владельцу сайта напрямую уведомлять Google о добавлении страниц или удаленный.Это позволяет Google планировать страницы для нового сканирования, что может обеспечить более высокое качество. пользовательский трафик. В настоящее время API индексирования можно использовать только для сканирования страниц с JobPosting или BroadcastEvent , встроенный в Видеообъект . Для сайтов с много недолговечных страниц, таких как объявления о вакансиях или прямые трансляции, API индексирования сохраняет контент свежий в результатах поиска, потому что он позволяет отправлять обновления по отдельности.

Вот некоторые вещи, которые вы можете делать с помощью Indexing API:

  • Обновить URL-адрес : уведомить Google о новом URL-адресе для сканирования или о том, что контент по ранее отправленному URL-адресу был обновлен.
  • Удаление URL-адреса : после удаления страницы со своих серверов уведомите Google, чтобы мы могли удалить страницу из нашего индекса и не предпринимать повторных попыток сканирования URL-адреса.
  • Получить статус запроса : Проверить, когда в последний раз Google получал уведомления каждого типа для данного URL.
  • Отправлять запросы пакетной индексации : Уменьшите количество HTTP-соединений, которые должен установить ваш клиент, объединив до 100 вызовов в один HTTP-запрос.

Карты сайта и API индексирования

Мы рекомендуем использовать Indexing API вместо карт сайта, потому что Indexing API предлагает роботу Googlebot сканировать ваши страницы раньше, чем обновлять карту сайта и проверять связь с Google. Тем не менее, мы по-прежнему рекомендуем отправлять карту сайта для покрытия всего вашего сайта.

Начать

Чтобы использовать API индексирования, выполните следующие действия.

  1. Выполните предварительные условия, включив API индексирования, создав новую учетную запись службы, подтвердив право собственности в Search Console и получив токен доступа для аутентификации вашего вызова API.
  2. Отправлять запросы на уведомление Google о новых, обновленных или удаленных веб-страницах.
  3. Вам может потребоваться больше квоты, чем установлено по умолчанию. Чтобы просмотреть текущую квоту и запросить дополнительную квоту, см. Квота.

Использование API индексирования | Разработчики Google

Обзор

Вы можете использовать Indexing API, чтобы сообщить Google об обновлении или удалении страниц из индекса Google. Запросы должны указывать расположение веб-страницы. Вы также можете получить статус уведомлений что вы отправили в Google.В настоящее время API индексирования можно использовать только для сканирования страниц с либо JobPosting , либо BroadcastEvent , встроенный в Видеообъект .

Когда вы отправляете запрос в Indexing API, укажите местоположение отдельной веб-страницы для уведомить Google, что он может сканировать или удалить эту страницу из своего индекса.

В следующих примерах показаны действия, которые можно выполнять с помощью Indexing API:

Обновить URL-адрес
Отправьте следующий HTTP-запрос POST на https: // indexing.googleapis.com/v3/urlNotifications:publish endpoint
{
  "url": "https://careers.google.com/jobs/google/technical-writer",
  "type": "URL_UPDATED"
} 
Удалить URL-адрес
Отправьте следующий HTTP-запрос POST на https://indexing.googleapis.com/v3/urlNotifications:publish конечную точку
{
  "url": "https://careers.google.com/jobs/google/technical-writer",
  "тип": "URL_DELETED"
} 
Получить статус уведомления
Отправьте HTTP-запрос GET на https: // indexing.googleapis.com/v3/urlNotifications/metadata endpoint 

Параметры

В следующей таблице описаны поля, необходимые для всех методов (обновление и удаление URL-адреса):

Поля
url

Обязательно

Полное расположение элемента, который вы хотите обновить или удалить.

тип

Обязательно

Тип отправленного вами уведомления.

Указания

Следующие инструкции применяются для обновления и удаления запросов URL.

  • Все вызовы https://indexing.googleapis.com/v3/UrlNotifications:publish ДОЛЖНЫ использовать «application / json» в качестве заголовка Content-Type .
  • Вы можете отправить один URL-адрес только в теле запроса на обновление или объединить до 100 запросов. в пакете, как описано в разделе Отправка запросов пакетного индексирования.
  • Тело запроса в этих примерах — это значение используемой переменной содержимого в примерах токенов доступа.

Обновить URL-адрес

Чтобы уведомить Google о новом URL-адресе для сканирования или о том, что контент на ранее отправленном URL-адресе был обновлено, выполните следующие действия:

  1. Отправьте запрос POST на следующую конечную точку:
    Отправьте HTTP-запрос POST на https://indexing.googleapis.com/v3/urlNotifications:publish 
  2. В теле запроса укажите расположение страницы, используя следующий синтаксис:
    {
      "url": " content_location ",
      "type": "URL_UPDATED"
    } 
  3. Google отвечает на успешные вызовы Indexing API сообщением HTTP 200 .Ответ HTTP 200 означает, что Google может вскоре попытаться повторно просканировать этот URL. Тело ответ содержит объект UrlNotificationMetadata , поля которого соответствуют полям, возвращаемым запросом статуса уведомления.
  4. Если вы не получили ответ HTTP 200 , см. Конкретные ошибки API индексирования.
  5. Если содержимое страницы изменится, отправьте другое уведомление об обновлении, которое должно заставить Google повторно просмотреть страницу.
  6. Вам может потребоваться больше квоты, чем установлено по умолчанию.Чтобы просмотреть текущую квоту и запросить дополнительную квоту, см. Квота.

Удалить URL-адрес

После удаления страницы со своих серверов или добавления тега в раздела данной страницы, уведомить Google, чтобы мы могли удалить страницу из наш индекс и чтобы мы не пытались снова сканировать и индексировать страницу. Прежде чем запросить удаление, URL должен возвращать код статуса 404 или 410, иначе страница содержит метатег .

Чтобы запросить удаление из нашего индекса, выполните следующие действия:

  1. Отправить запрос POST в следующая конечная точка:
    Отправьте HTTP-запрос POST на https://indexing.googleapis.com/v3/urlNotifications:publish 
  2. Укажите URL-адрес, который вы хотите удалить, в теле запроса, используя следующий синтаксис:
    {
      "url": " content_location ",
      "тип": "URL_DELETED"
    } 

    Например:

    {
      "url": "https: // карьера.google.com/jobs/google/technical-writer ",
      "тип": "URL_DELETED"
    } 
  3. Google отвечает на успешные вызовы Indexing API сообщением HTTP 200 . Ответ HTTP 200 означает, что Google может удалить этот URL из индекса. Тело ответ содержит объект UrlNotificationMetadata , поля которого соответствуют полям, возвращаемым запросом статуса уведомления.
  4. Если вы не получили ответ HTTP 200 , см. Конкретные ошибки API индексирования.
  5. Вам может потребоваться больше квоты, чем установлено по умолчанию. Чтобы просмотреть текущую квоту и запросить дополнительную квоту, см. Квота.

Получить статус уведомления

Вы можете использовать Indexing API, чтобы проверить, когда Google в последний раз получал уведомления каждого типа для данного URL. Запрос GET не сообщает вам, когда Google индексирует или удаляет URL; он только возвращает, успешно ли вы отправили запрос.

Чтобы получить статус уведомления, выполните следующие действия:

  1. Отправить запрос GET на следующая конечная точка.Указанные вами URL-адреса должны иметь кодировку URL. Например, замените : (двоеточия) на % 3A и / (косая черта) с % 2F .
    Отправьте HTTP-запрос GET на https://indexing.googleapis.com/v3/urlNotifications/metadata?url=  url-encoded_url  

    Например:

    ПОЛУЧИТЬ https://indexing.googleapis.com/v3/urlNotifications/metadata?url=https%3A%2F%2Fcareers.google.com%2Fjobs%2Fgoogle%2Ftechnical-writer
     
  2. API индексирования отвечает HTTP 200 сообщение с полезной нагрузкой, содержащей сведения об уведомлении.В следующем примере показано тело ответа, содержащее информацию об обновлении и уведомлении об удалении:
    {
      url: "http://foo.com"
      последнее обновление {
        тип: "URL_UPDATED"
        notify_time: "2017-07-31T19: 30: 54.524457662Z"
      }
      latest_remove {
        тип: "URL_DELETED"
        notify_time: "2017-08-31T19: 30: 54.524457662Z"
      }
    }
     
  3. Если вы не получили ответ HTTP 200 , см. Конкретные ошибки API индексирования.
  4. Вам может потребоваться больше квоты, чем установлено по умолчанию.Чтобы просмотреть текущую квоту и запросить дополнительную квоту, см. Квота.

Отправить пакетные запросы индексирования

Чтобы уменьшить количество HTTP-соединений, которые должен выполнять ваш клиент, вы можете объединить до 100 вызовов. к API индексирования в один HTTP-запрос. Вы делаете это в запросе, состоящем из нескольких частей, который называется партия.

Квота рассчитывается на уровне URL. Например, если вы объедините 10 запросов в один HTTP-запрос, он по-прежнему считается как 10 запросов для вашей квоты. Узнайте больше о том, как запросить дополнительную квоту.

При отправке пакетного запроса к Indexing API используйте следующую конечную точку:

https://indexing.googleapis.com/batch 

Тело пакетного запроса состоит из нескольких частей. Каждая часть сама по себе является полным HTTP-запросом, со своим собственным глаголом, URL-адресом, заголовками и телом. Каждая часть в пакетном запросе не может превышать 1 МБ в размер.

Чтобы упростить отправку пакетных запросов, клиентские библиотеки API Google поддерживают пакетную обработку. функциональность. Дополнительные сведения о пакетной обработке с клиентскими библиотеками см. В следующих разделах. страниц для конкретных языков:

Если вы используете примеры пакетной обработки на этих страницах, вам может потребоваться обновить код, отражающий требования к реализации, описанные в Получите токен доступа.

Следующий пример тела сообщения пакетного запроса включает уведомление об обновлении и уведомление об удалении:

POST / пакетный HTTP / 1.1
Хост: indexing.googleapis.com
Content-Length:  content_length 
Content-Type: составной / смешанный; border = "=============== 7330845974216740156 =="
Авторизация: предъявитель  oauth3_token 

- =============== 7330845974216740156 ==
Тип содержимого: application / http
Content-Transfer-Encoding: двоичный
Идентификатор содержимого: 

POST / v3 / urlNotifications: опубликовать   [1]  
Тип содержимого: приложение / json
принять: приложение / json
длина содержимого: 58

{"url": "http: // пример.ru / jobs / 42 "," type ":" URL_UPDATED "}
- =============== 7330845974216740156 ==
Тип содержимого: application / http
Content-Transfer-Encoding: двоичный
Идентификатор содержимого: 

POST / v3 / urlNotifications: опубликовать   [2]  
Тип содержимого: приложение / json
принять: приложение / json
длина содержимого: 75

{"url": "http://example.com/widgets/1", "type": "URL_UPDATED"}
- =============== 7330845974216740156 ==
Тип содержимого: application / http
Content-Transfer-Encoding: двоичный
Идентификатор содержимого: 

POST / v3 / urlNotifications: опубликовать   [3]  
Тип содержимого: приложение / json
принять: приложение / json
длина содержимого: 58

{"url": "http: // пример.ru / jobs / 43 "," type ":" URL_DELETED "}
- =============== 7330845974216740156 == 

Для получения дополнительной информации см. Отправка пакетных запросов.

Используя Индекс качества воздуха | AirNow.gov

Используйте индекс качества воздуха (AQI), чтобы узнать больше о качестве воздуха в вашем регионе и о наилучшем времени для занятий на свежем воздухе.

Индекс качества воздуха в США — дневной индекс

Что это такое: Индекс качества воздуха США, или AQI , — это инструмент Агентства по охране окружающей среды для ежедневной оценки качества воздуха.Он использует категории с цветовой кодировкой и предоставляет заявления для каждой категории, которые рассказывают вам о качестве воздуха в вашем районе, о том, какие группы людей могут быть затронуты, а также о шагах, которые вы можете предпринять, чтобы уменьшить воздействие загрязнения воздуха. Он также используется в качестве основы для прогнозов качества воздуха и текущих отчетов о качестве воздуха.

Кто его выпускает: EPA выпускает национальный индекс качества воздуха с 1976 года, чтобы предоставлять простой для понимания ежедневный отчет о качестве воздуха в формате, одинаковом для разных штатов.AQI в том виде, в каком мы его знаем сегодня, был выпущен в 1999 году; С тех пор он несколько раз обновлялся, чтобы отразить последние стандарты качества воздуха для здоровья.

Какие загрязняющие вещества он охватывает: Существует AQI США для пяти основных загрязнителей, которые регулируются Законом о чистом воздухе: озон, загрязнение твердыми частицами (также называемыми твердыми частицами), монооксид углерода, диоксид азота и диоксид серы. AQI для каждого загрязнителя, как правило, основывается на национальном стандарте качества атмосферного воздуха для здоровья для этого загрязнителя и научной информации, которая поддерживает этот стандарт.

Каковы временные рамки : Зависит от загрязнителя. Озон AQI — это 8-часовой индекс; для загрязнения частицами — 24 часа.

Где это можно получить: В районах метро с населением более 350 000 человек требуется сообщать ежедневный AQI. Многие другие области сообщают об этом как о государственной услуге. Вы можете найти ежедневный AQI на AirNow, а также на сайтах государственных и местных агентств. Некоторые агентства также сообщают об AQI через свои местные СМИ или по горячим линиям.

Как использовать: Проверьте AQI за предыдущий день, чтобы узнать больше о качестве воздуха в вашем районе.

Подробнее о AQI

Подробнее о тенденциях в области качества воздуха в США

Прогнозы AQI

Что это такое: Прогноз AQI дня. Прогнозы обычно выдаются во второй половине дня на следующий день.

Кто их выдает: Государственные и местные синоптики по всей стране.Они используют ряд инструментов, включая модели прогнозов погоды, спутниковые изображения, данные мониторинга воздуха и компьютерные модели, которые оценивают, как загрязнение распространяется по воздуху. Они также используют свои собственные знания о том, как загрязнение ведет себя в определенных сообществах, чтобы выпустить прогноз качества воздуха на следующий день.

Какие загрязнители они охватывают: Большинство государственных и местных специалистов по прогнозированию качества воздуха выпускают прогнозы загрязнения озоном и частицами, которые являются двумя наиболее распространенными загрязнителями в США.S. Некоторые районы также выпускают прогнозы по двуокиси азота и окиси углерода.

Какие временные рамки они охватывают: В большинстве случаев прогнозы AQI ориентированы на следующий день. Для озона прогноз AQI фокусируется на периоде в течение дня, когда ожидается, что средние 8-часовые концентрации озона будут самыми высокими. Для PM прогноз предсказывает среднюю 24-часовую концентрацию на следующий день.

Что они говорят вам: Прогнозы AQI сообщают вам, каким ожидается AQI на следующий день, какие группы людей могут быть затронуты, и шаги, которые люди могут предпринять, чтобы уменьшить их воздействие на загрязненный воздух.

Где их получить: Государственные и местные агентства предоставляют прогнозы AQI в качестве государственной услуги. Прогнозы для вашего региона можно найти на AirNow, на веб-сайтах государственных, местных и племенных авиационных агентств, в местных средствах массовой информации и в некоторых национальных СМИ.

Как ими пользоваться: Используйте прогнозы AQI, чтобы помочь вам спланировать занятия на свежем воздухе на день. Подобно тому, как прогноз погоды позволяет узнать, брать ли с собой зонт, прогноз качества воздуха позволяет узнать, когда вы, возможно, захотите изменить занятия на свежем воздухе, чтобы снизить уровень загрязнения воздуха, которым вы вдыхаете.Многие синоптики также проводят «обсуждение прогнозов», которое позволяет узнать, когда ожидается наибольшее загрязнение в течение дня — и есть ли моменты, когда ожидается улучшение качества воздуха.

Некоторые районы выпускают прогнозы AQI на несколько дней, чтобы помочь вам в планировании. Но поскольку все может измениться, рекомендуется проверять прогноз каждый день.

Модель NowCast AQI

Что это такое: NowCast AQI показывает ваше текущее качество воздуха с помощью цветов и шкалы AQI.

Кто его выдает: EPA использует два алгоритма, называемые «NowCasts», чтобы связать почасовые показания мониторов качества воздуха с AQI для озона и AQI для загрязнения частицами.

Какие загрязняющие вещества он охватывает: EPA рассчитывает NowCast для двух загрязняющих веществ: озона и твердых частиц. Для каждого есть свой алгоритм.

Какие временные рамки он охватывает: NowCast показывает качество воздуха за последний доступный час, используя расчет, который включает данные за несколько часов за прошлые периоды.NowCast использует более длинные средние значения в периоды стабильного качества воздуха и более короткие средние значения, когда качество воздуха быстро меняется, например, во время лесных пожаров.

Что он говорит вам: NowCast предоставляет вам самую свежую информацию о качестве воздуха в том месте, где вы находитесь. Поскольку качество воздуха может меняться в течение дня, вы также можете ожидать изменения AQI NowCast.

Где это можно получить: Везде, где вы видите на AirNow.gov информацию о «текущем качестве воздуха», рассчитанную с помощью NowCast.Приложение AirNow и виджет AirNow также используют NowCast. EPA также предоставляет текущую информацию о качестве воздуха государственным и местным агентствам, средствам массовой информации, разработчикам приложений и другим лицам через интерфейс прикладного программирования (также называемый API).

Как использовать: Проверьте NowCast AQI, чтобы узнать, подходящее ли сейчас время для активного отдыха. Даже в дни, когда прогноз AQI плохой, в течение дня могут быть моменты, когда качество воздуха подходит для активного отдыха.

Техническая информация об алгоритмах NowCast

Индексирование | Справочник по API | Документация Algolia

Рекомендуется использовать клиент Kotlin API, который лучше подходит для разработки под Android.

Создание индексов

Вам не нужно явно создавать индекс, Algolia создает его автоматически при первом добавлении объекта.

Объекты не имеют схемы, поэтому для начала индексации не требуется предварительная настройка.

Если вы хотите настроить свой индекс, в разделе настроек содержатся подробные сведения о дополнительных настройках.

Убедитесь, что вы не используете какую-либо конфиденциальную или личную информацию (PII) в качестве своего индексного имени , включая имена пользователей, идентификаторы или адреса электронной почты.Имена индексов появляются в сетевых запросах, вы должны считать их общедоступными.

Объекты индекса

Схема объектов

Объекты, которые вы индексируете, не имеют схемы : они могут содержать любое количество полей, с любым определением и содержанием.

Движок не ожидает, что содержат ваши данные, кроме некоторых проблем с форматированием, и объект с идентификатором .

ID объекта

Каждому объекту (записи) в индексе в конечном итоге требуется уникальный идентификатор, называется objectID .Вы можете создать objectID самостоятельно и отправить его при индексировании. Если вы не отправите objectID , Algolia сгенерирует его для вас.

Отправленная или сгенерированная, после добавления записи она имеет уникальный идентификатор, называемый objectID .

Вы можете использовать этот идентификатор позже с любым методом, который должен ссылаться на конкретную запись, например saveObjects или partialUpdateObjects .

Добавление, обновление и частичное обновление объектов

addObjects

Метод addObjects не требует идентификатора объекта .

  • Если вы укажете objectID :
    • Если objectID не существует в индексе, Algolia создает запись
    • Если objectID уже существует, Algolia заменяет запись
  • Если вы не , укажите objectID :
    • Algolia генерирует objectID и возвращает его в ответе

сохранитьОбъекты

Метод saveObjects требует objectID .

  • Если существует objectID , Algolia заменяет запись
  • Если objectID присутствует, но не существует, Algolia создает запись
  • Если objectID не указан , метод возвращает ошибку

partialUpdateObjects

Для метода partialUpdateObjects требуется идентификатор объекта .

  • Если существует objectID , Algolia заменяет атрибуты
  • Если objectID указан, но не существует, Algolia создает новую запись
  • Если objectID не указан , метод возвращает ошибку

Примечание. , как упоминалось ранее, partialUpdateObjects не заменяет весь объект, а добавляет, удаляет или обновляет переданные вами атрибуты.Остальные атрибуты остаются нетронутыми. Это отличается от addObjects и saveObjects , которые заменяют весь объект.

Для всех методов индексации

  • Метод для всех трех может быть в единственном или множественном числе.
    • Если единственное число (например, addObject ), метод принимает один объект в качестве параметра
    • Если во множественном числе (например, addObjects ), метод принимает один или несколько объектов

Примечание: см. Отдельные методы для получения дополнительной информации о синтаксисе и использовании.

Терминология

Объект и запись

В документации термины «объект» и «запись» используются как синонимы. Хотя они, безусловно, могут быть разными в области компьютерных наук, в домене Алголии они такие же:

  • индексы содержат «объекты» или «записи»
  • JSON содержит «объекты» или «записи»

Индексы и индексы

В документации эти слова используются как синонимы. Первое — это американское написание, тогда как API часто использует британское написание.

Атрибуты

Все объекты и записи содержат атрибуты, иногда называемые полями или элементами. Некоторые атрибуты представляют собой пары «ключ-значение», тогда как другие могут быть более сложными, как коллекция или объект.

Асинхронные методы

Большинство этих методов асинхронны. На самом деле при вызове этих методов вы добавляете новое задание в очередь: именно это задание, а не метод, на самом деле выполняет желаемое действие .Обычно движок выполняет работу за секунды, если не за миллисекунды. Но все зависит от очереди: если в очереди несколько ожидающих задач, новое задание должно дождаться своей очереди.

Чтобы помочь управлять этой асинхронной индексацией, каждый метод возвращает уникальный taskID , который можно использовать с методом waitTask . Использование метода waitTask гарантирует, что задание завершено, прежде чем приступить к новым запросам. Вы можете использовать это для управления зависимостями.Например, при удалении индекса перед созданием нового индекса с тем же именем или при очистке индекса перед добавлением новых объектов.

Заставьте Google мгновенно проиндексировать ваш сайт с помощью Indexing API

В этом посте мы рассмотрим, как можно использовать новый API индексирования Google , чтобы страницы и контент вашего веб-сайта сканировались немедленно, а не ждать! 🖖

Примечание: Процесс немного изменился с тех пор, как было записано вышеупомянутое видео, так что не стесняйтесь пока обращаться к актуальному письменному руководству ниже.

Вот почему этот действительно стоит дополнительных усилий.

  1. Ранг быстрее (особенно важно для чувствительного ко времени контента)
  2. Увеличьте свои шансы на ранжирования над конкурентами
  3. Поддерживайте актуальность результатов поиска для выше качество пользовательский трафик

Спасибо к Google Indexing API, Rank Math SEO для WordPress и этому руководству, которое мы составили для вас, теперь вы можете повысить рейтинг своего сайта до быстрее .

Используя этот метод, вы можете оставаться на шаг впереди своих конкурентов , убедившись, что ваш сайт сканируется и имеет возможность ранжироваться раньше, чем их сайт, что чрезвычайно важно, когда речь идет о своевременном и конкурентоспособном контенте.

Процесс настройки, как правило, не очень простой, но если вы будете следовать этому пошаговому руководству , вы сразу же приступите к работе (или, я думаю, вы могли бы сказать, что поднялись и ранжировали) ! Итак, без лишних слов — давайте сразу же посмотрим, как это настроить.

Примечание : Google рекомендует использовать Indexing API ТОЛЬКО для веб-сайтов публикации вакансий и потоковой передачи в реальном времени. В ходе наших тестов мы обнаружили, что он работает на любом типе веб-сайтов с отличными результатами, и создали этот плагин для тестирования.

Если вы не уверены, хотите ли вы использовать это или нет, прекратите читать и не продолжайте дальше. Как рекомендует Google, вам не следует использовать этот API индексирования на веб-сайтах с деньгами. Пожалуйста, действуйте на свой страх и риск.

Мы понимаем, что это не для всех 🙂

ДОКАЗАТЕЛЬСТВО: вот как Google ответил на наш запрос

В первый час после публикации этой статьи: Через пару часов Google предоставил нам избранный фрагмент для поискового запроса

2 шага для создания проекта API индексирования

2.1 Перейдите в консоль Google API и создайте новый проект

Убедитесь, что вы создаете новый проект Indexing API , который можно сделать автоматически, нажав здесь. Затем нажмите продолжить.

Если после нажатия Продолжить , вы увидите следующий экран, значит, вы успешно создали проект:

Обратите внимание: нет необходимости нажимать кнопку «Перейти к учетным данным». Вы можете закрыть эту вкладку.

2.2 Теперь создайте учетную запись службы

После создания проекта создайте учетную запись службы, открыв страницу учетных записей служб. Сначала вам будет предложено выбрать проект API, в котором вы хотите создать эту учетную запись службы (созданную на предыдущем шаге).

После выбора проекта, для которого вы хотите создать учетную запись службы, вы попадете на следующую страницу, где вам просто нужно нажать кнопку Создать учетную запись службы , выделенную ниже:

На экране Создать учетную запись службы введите имя и описание для вновь созданной учетной записи службы.

Выберите и скопируйте весь идентификатор учетной записи службы (тот, который выглядит как адрес электронной почты), потому что он вам понадобится позже. Затем нажмите кнопку Create внизу:

Нажмите Создать и продолжить , чтобы перейти к следующему шагу, где вам нужно изменить роль на Владелец и, как вы уже догадались, еще раз нажмите «Продолжить»…

После того, как вы установили роль Владелец , как показано выше, просто нажмите «Продолжить», чтобы сохранить это изменение, а затем нажмите «Готово».

После этого вы сможете загрузить файл, содержащий ваш ключ API . Для этого просто щелкните три вертикальные точки в столбце Действия , а затем выберите Управление ключами , как показано ниже:

После этого вы попадете на следующую страницу, когда сможете щелкнуть Добавить ключ и затем выбрать опцию Создать новый ключ , как показано ниже:

Выберите формат по умолчанию JSON , когда будет предложено в наложении, и нажмите Создать :

После нажатия Создайте файл.json будет автоматически загружен в ваш браузер, что означает, что вы успешно создали ключ API и можете переходить к следующему шагу …

2.3 Добавьте учетную запись службы в качестве владельца своего ресурса консоли поиска Google

Для этого вам нужно будет зарегистрировать и подтвердить свой веб-сайт в Google Search Console (если вы еще этого не сделали), что очень просто: просто выполните рекомендуемые действия, чтобы подтвердить право собственности на свою собственность.

После проверки вашего свойства откройте консоль поиска Google, выберите свой ресурс слева (при появлении запроса), а затем нажмите Настройки внизу:

Нажмите Пользователи и разрешения :

Нажмите на три точки рядом со своей учетной записью, а затем нажмите Управление собственниками :

Страница откроется в новой вкладке.Прокрутите вниз и нажмите кнопку Добавить владельца в разделе Проверенные владельцы :

Введите идентификатор учетной записи службы (тот, который вы скопировали ранее) в поле адреса электронной почты нового владельца и нажмите «Продолжить»:

Вернитесь на предыдущую вкладку и обновите ее. Теперь вы должны увидеть учетную запись службы, указанную как новый владелец.

Вы можете использовать одну Project , Service Account и JSON API Key на нескольких сайтах, просто убедитесь, что Service Account добавлен как владелец для всех сайтов в Search Console.

3 Настройте подключаемый модуль

3.1 Вставьте свой API-ключ в настройки плагина

После установки плагина просто перейдите к Rank Math> Instant Indexing Settings в админке WordPress и вставьте содержимое файла JSON или просто загрузите файл.

Выберите типы сообщений, для которых вы хотите, чтобы API индексирования проверял связь с Google для сканирования вашего веб-сайта, как только сообщение будет опубликовано, обновлено или удалено, и нажмите «Сохранить изменения».

3,2 Теперь пришло время использовать API индексирования Google, чтобы мгновенно получить любую публикацию или страницу на вашем сайте, проиндексировавшую

почти .

Перейдите на вкладку консоли сверху страницы. Экран должен выглядеть примерно так, как показано ниже.

Откройте страницу консоли плагина из панели управления. Введите URL-адрес (или несколько) в разделе «Мгновенное индексирование» и нажмите кнопку «Отправить в API» .

Через секунду вы должны увидеть ответ API, аналогичный приведенному ниже.

Вы можете использовать параметры «Удалить» или «Получить статус», чтобы удалить URL-адрес из индекса или получить текущий статус URL-адреса.

Вместо того, чтобы вводить здесь URL-адреса и затем индексировать их, вы также можете сделать это из раздела «Сообщения WordPress». Там вы должны увидеть возможность обновить сообщение или проверить его статус. Вы также можете использовать параметры массовых действий, чтобы быстро проиндексировать или обновить несколько сообщений.

И все! Мы надеемся, что вы смогли хорошо использовать это руководство, чтобы помочь вам начать работу с Google Indexing API.

Итак, заставить Google мгновенно проиндексировать ваш сайт было не так уж сложно, не так ли? Если у вас есть какие-либо вопросы, комментарии или предложения — не стесняйтесь твитнуть @rankmathseo. Нам не терпится услышать от вас. 😅

Обратите внимание: После успешной отправки ваш веб-сайт начнет сканирование через несколько минут. Узнайте больше обо всем процессе здесь.

PS: Было бы упущением не упомянуть, что идея этого поста возникла у нас после прочтения поста Дэвида Соттимано о Google Indexing API.Еще одна статья, на которую стоит обратить внимание, — это Тобиас Уиллманн, в которой он тщательно протестировал API индексирования с обычными URL-адресами, для которых нет задания , публикующего структурированные данные или Livestream .

PS 2: Официально API предназначен для страниц, содержащих структурированные данные о вакансиях и Livestream, однако, судя по нашим внутренним тестам и нашей публичной бета-версии, Google будет сканировать и индексировать страницы любого типа независимо от структурированных данных. Это эффективный способ быстро просканировать страницы, а не запрашивать их из консоли поиска Google.

Кроме того, в дальнейшем Google планирует использовать Indexing API вместо файлов Sitemap.

4 наиболее распространенных ошибки и способы их устранения

4.1 Как установить плагин?

Вы можете установить плагин на свой сайт, как любой другой плагин WordPress, используя один из этих двух методов:

A) Загрузить через панель управления WordPress

Загрузите ZIP-файл со своей панели управления WordPress в Plugins> Add New> Upload .

B) Загрузите его через FTP.

Сначала вам нужно извлечь zip-файл на свой компьютер, а затем загрузить новую папку google-indexing-api-by-rank-math на свой сервер в следующей папке: / wp-content / plugins .

4,2 403 В доступе отказано. Не удалось подтвердить право собственности на URL.

Убедитесь, что сервисный аккаунт указан как владелец сайта в Search Console:

Если вы не видите его там, выполните следующие действия:

На следующей странице добавьте сервисный аккаунт в качестве владельца с помощью кнопки:

Затем вернитесь в Search Console и обновите страницу, чтобы убедиться, что учетная запись службы добавлена ​​правильно.

4.3 404 Запрошенный объект не найден.

Используйте консоль API, чтобы Опубликовать / обновить страницу один раз, затем вы можете использовать действие Получить статус .

4.4 403 API индексирования ранее не использовался в проекте [название проекта] или отключен. Включите его, посетив [URL], затем повторите попытку.

Скопируйте и вставьте URL-адрес в свой браузер, чтобы открыть его, или перейдите на эту страницу и выберите свой проект в раскрывающемся списке вверху, затем включите API:

4.5 Могу ли я использовать плагин без Rank Math?

Да, это автономный плагин, работающий независимо от Rank Math. Однако мы рекомендуем использовать его вместе с Rank Math для достижения оптимальных результатов.

4.6 Могу ли я использовать один и тот же проект API / учетную запись службы / ключ API JSON для нескольких сайтов?

Да, вы можете использовать один и тот же проект , учетную запись службы и ключи API на нескольких сайтах, просто убедитесь, что учетная запись службы Владелец всех сайтов в Search Console.

4.7 Могу ли я запросить индексацию страниц с разных веб-сайтов только с одного веб-сайта?

Нет. Вы можете запросить индексирование для URL-адресов в домене только из самого домена, но не с других веб-сайтов, даже если они проверены с той же учетной записью службы. Например: если вы используете одну и ту же учетную запись службы на веб-сайте A и веб-сайте B, то вы, , не можете запросить индексацию URL-адресов веб-сайта B с веб-сайта A. Вам придется сделать это с самого веб-сайта B.

4.8 Могу ли я отправить страницы, на которых нет структурированных данных о вакансиях или прямой трансляции?

API официально поддерживает страницы, содержащие структурированные данные Job Posting и Livestream , и его рекомендуется использовать только на таких веб-сайтах.

Однако из наших внутренних тестов и нашей общедоступной бета-версии кажется, что Google сканирует, индексирует (если контент является оригинальным, новым и полезным) и переходит по ссылкам на любой странице, которую вы отправляете через API, независимо от ее структурированных данных.

4.9 Прошло больше 24 часов, а Google все еще не проиндексировал мою страницу. Что делать?

В наших тестах робот Googlebot просканировал страницы, которые мы опубликовали через API, в течение нескольких минут, и вы можете подтвердить то же самое на своем сайте, проверив журналы доступа.

Однако это не всегда приводит к индексации содержимого. Прежде чем URL-адрес появится в результатах поиска, может пройти от нескольких минут до нескольких дней или даже недель. Использование этого плагина не гарантирует, что ваши страницы будут отображаться в результатах поиска.

4.10 Я получаю сообщение «Ошибка не определена», когда пытаюсь проиндексировать URL-адрес

Эта ошибка может возникнуть при попытке отправить URL-адреса с другого веб-сайта для индексации. Убедитесь, что вы пытаетесь обновить, удалить или проверить статус URL-адресов, которые находятся в том же домене, что и тот, из которого вы инициируете запросы.

Обзор (Java SE 11 и JDK 11)

java.base

Определяет базовые API платформы Java SE.

java.compiler

Определяет языковую модель, обработку аннотаций и API-интерфейсы компилятора Java.

java.datatransfer

Определяет API для передачи данных между приложениями и внутри них.

java.desktop

Определяет наборы инструментов пользовательского интерфейса AWT и Swing, а также API для специальные возможности, аудио, изображения, печать и JavaBeans.

Java.инструмент

Определяет службы, которые позволяют агентам инструментальные программы, работающие на JVM.

java.logging

Определяет API ведения журналов Java.

java.management

Определяет API расширений управления Java (JMX).

java.management.rmi Определяет разъем RMI для удаленного API Java Management Extensions (JMX).
Java.именование

Определяет API интерфейса имен и каталогов Java (JNDI).

java.net.http

Определяет HTTP-клиент и API-интерфейсы WebSocket.

java.prefs

Определяет API настроек.

java.rmi

Определяет API удаленного вызова методов (RMI).

java.scripting

Определяет API сценариев.

java.se

Определяет API платформы Java SE.

java.security.jgss

Определяет привязку Java к API общих служб безопасности IETF (GSS-API).

java.security.sasl

Определяет поддержку Java для уровня простой аутентификации и безопасности IETF. (SASL).

java.smartcardio

Определяет API ввода-вывода смарт-карты Java.

java.sql

Определяет JDBC API.

java.sql.rowset

Определяет JDBC RowSet API.

java.transaction.xa

Определяет API для поддержки распределенных транзакций в JDBC.

java.xml

Определяет Java API для обработки XML (JAXP), Streaming API для XML (StAX), простой API для XML (SAX) и API объектной модели документа W3C (DOM).

java.xml.crypto

Определяет API для криптографии XML.

jdk. Доступ

Определяет служебные классы JDK, используемые разработчиками вспомогательных технологий.

jdk.attach

Определяет API присоединения.

jdk.charsets Предоставляет кодировок , которые отсутствуют в java.base (в основном двухбайтовые и наборы символов IBM).
jdk.compiler
jdk.crypto.cryptoki

Обеспечивает реализацию поставщика безопасности SunPKCS11.

jdk.crypto.ec

Обеспечивает реализацию поставщика безопасности SunEC.

jdk.dynalink

Определяет API для динамического связывания высокоуровневых операций с объектами.

jdk.editpad Обеспечивает реализацию службы панели редактирования, используемой jdk.jshell .
jdk.hotspot.agent

Определяет реализацию агента удобства обслуживания HotSpot.

jdk.httpserver

Определяет API HTTP-сервера для JDK.

jdk.jartool Определяет инструменты для управления файлами Java Archive (JAR), включая сосуд и jarsigner инструментов.
jdk.javadoc
jdk.jcmd Определяет инструменты для диагностики и устранения неполадок JVM например, jcmd , jps , jstat инструменты.
jdk.jconsole Определяет графический инструмент JMX, jconsole , для мониторинга и управления запущенным приложением.
jdk.jdeps Определяет инструменты для анализа зависимостей в библиотеках и программах Java, включая jdeps , javap и jdeprscan инструментов.
jdk.jdi

Определяет интерфейс отладки Java.

jdk.jdwp.agent

Предоставляет реализацию агента Java Debug Wire Protocol (JDWP).

jdk.jfr

Определяет API для JDK Flight Recorder.

jdk.jlink Определяет инструмент jlink для создания среды выполнения изображений, инструмент jmod для создания и управления Файлы JMOD и инструмент jimage для проверки специфичный для реализации JDK файл-контейнер для классов и ресурсов.
jdk.jshell Этот модуль обеспечивает поддержку Инструменты оценки фрагментов языка программирования Java, такие как Циклы чтения-оценки-печати (REPL), включая инструмент jshell .
jdk.jsobject

Определяет API для объекта JavaScript.

jdk.jstatd Определяет инструмент jstatd для запуска демона для инструмента jstat для удаленного мониторинга статистики JVM.
jdk.localedata Предоставляет данные о языковом стандарте для других языков, кроме США.
jdk.management

Определяет интерфейсы управления JDK для JVM.

jdk.management.agent

Определяет агент управления JMX.

jdk.management.jfr

Определяет интерфейс управления для JDK Flight Recorder.

jdk.naming.dns

Предоставляет реализацию DNS-провайдера именования Java.

jdk.naming.rmi

Предоставляет реализацию поставщика именования Java RMI.

jdk.net

Определяет специфичный для JDK сетевой API.

jdk.pack Определяет инструменты для преобразования файла JAR в сжатый файл pack200 и преобразование упакованного файла в файл JAR, включая упаковка 200 и распаковать 200 инструментов.
jdk.rmic Определяет компилятор rmic для создания заглушек и скелеты, использующие протокол удаленных методов Java (JRMP) для удаленных объектов.
jdk.scripting.nashorn

Обеспечивает реализацию скриптового движка Nashorn и среда выполнения для программ, написанных на ECMAScript 5.1.

jdk.sctp

Определяет специфичный для JDK API для SCTP.

jdk.security.auth

Предоставляет реализации javax.security.auth. * интерфейсы и различные модули аутентификации.

jdk.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *