Вопрос или проблема
Моя функция ниже включает вызов cURL, который отправляет текстовую строку в API анализа текста Google Cloud, возвращает объект ответа, который мы затем анализируем, чтобы получить конкретный фрагмент.
Мне предложили переключить cURL оператор PHP на использование wp_remote_get
из WordPress.
Я прочитал документацию по этому поводу, но, честно говоря, я не понимаю, как мои заголовки cURL должны сопоставляться с аргументами wp_remote_get
. Или даже если это должно быть wp_remote_post
, а не wp_remote_get
.
Как я могу попытаться понять, что делать здесь?
function get_entity_type(
$text_to_analyse, // переданная строка, которая будет передана в GCloud NLP
$entity = 'type' // часть каждого результата "entities" для возврата
) {
// Ключ API Google Cloud
$options = get_option( 'cxt_settings' );
$google_nlp_api = $options['cxt_gcloud'];
// Предоставляем данные в формате JSON
$data="{
"document":{
"type":"PLAIN_TEXT",
"content":"".$text_to_analyse.'"
},
"encodingType":"UTF8"
}';
$payload = $data;
// Вызов API-эндоинта с ключом API
$url="https://language.googleapis.com/v1/documents:analyzeEntities?key=".$google_nlp_api;
// Подготовка к получению результатов с использованием cURL
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
// Установка HTTP-заголовка для POST-запроса
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($payload))
);
// Отправка POST-запроса
$result = curl_exec($ch);
// Сохранение результата в массиве
$arr = json_decode($result, true);
// Закрытие сессии cURL
curl_close($ch);
// Извлечение первого значения из объекта ответа
$ent_val = $arr['entities'][0][$entity];
return $ent_val;
// Список возможных сущностей: https://cloud.google.com/natural-language/docs/reference/rest/v1/Entity#Type
// UNKNOWN
// PERSON
// LOCATION
// ORGANIZATION
// EVENT
// WORK_OF_ART
// CONSUMER_GOOD
// OTHER
}
/* ########################################################################## *
*
* ОПРЕДЕЛЕНИЕ СУЩНОСТИ через вызов wp_remote_post()
*
/* ########################################################################## */
function get_entity_type_via_wp(
$text_to_analyse, // переданная строка, которая будет передана в GClouD NLP
$entity = 'type' // часть каждого результата "entities" для возврата
) {
// Ключ API Google Cloud
$options = get_option( 'cxt_settings' );
$google_nlp_api = $options['cxt_gcloud'];
// Вызов API-эндоинта с ключом API
$url="https://language.googleapis.com/v1/documents:analyzeEntities?key=".$google_nlp_api;
// Запрос payload
$payload = '{
"document":{
"type":"PLAIN_TEXT",
"content":"'.$text_to_analyse.'"
},
"encodingType":"UTF8"
}';
// Вызов API Google NLP через wp_remote_post();
// cf. https://wordpress.stackexchange.com/questions/349271/how-to-convert-this-curl-to-wp-remote?noredirect=1#comment510738_349271
//
$result_full = wp_remote_post(
$url,
array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(
'Content-Type' => 'application/json; charset=utf-8'
),
'body' => $payload, // Payload, текст для анализа
'data_format' => 'body'
)
);
// Только часть "body"
$result_entities = $result_full['body'];
// Сохранение результата в массиве
$arr = json_decode($result_entities, true);
// Извлечение первого значения из объекта ответа
$ent_val = $arr['entities'][0][$entity];
return $ent_val;
// return $ent_val;
// Список возможных сущностей: https://cloud.google.com/natural-language/docs/reference/rest/v1/Entity#Type
// UNKNOWN
// PERSON
// LOCATION
// ORGANIZATION
// EVENT
// WORK_OF_ART
// CONSUMER_GOOD
// OTHER
}
Почему вы это делаете?
WordPress создан на PHP и cURL работает отлично в WordPress. cURL очень мощный и имеет больше возможностей
.
Ответ или решение
Теория:
Когда вы работаете с API в WordPress, лучшей практикой является использование стандартных функций WordPress, таких как wp_remote_get
и wp_remote_post
, вместо использования встроенных PHP функций, таких как cURL. Это связано с тем, что функции WordPress более интегрированы в инфраструктуру WordPress и учитывают такие аспекты, как безопасность, прокси-серверы, и настройки HTTP в WordPress. Они также облегчают отладку и использование других встроенных функций WordPress.
Пример:
Ваш код использует cURL для взаимодействия с Google Cloud Natural Language API, чтобы анализировать текст и возвращать типы обнаруженных сущностей. Ваша задача заключается в том, чтобы перевести это взаимодействие с использованием wp_remote_post
.
Ваша исходная функция с использованием cURL включает в себя набор действий: инициирование cURL, установка опций POST-запроса, добавление заголовков, отправка запроса и обработка полученного ответа.
Применение:
-
Конфигурация запроса:
Используйтеwp_remote_post
, чтобы отправить POST-запрос к API. Определите URL API, включив в него ключ API. Определите заголовки и тело запроса, которые будут отправлены. -
Настройка параметров:
Используйте параметры массива вwp_remote_post
для передачи заголовков запроса, типа запроса (POST), и времени ожидания. Убедитесь, что заголовокContent-Type
установлен наapplication/json
, чтобы API понимало, что вы отправляете данные в формате JSON. -
Обработка ответа:
Как только вы получите ответ, используйте функциюwp_remote_retrieve_body
для извлечения тела ответа. После этого декодируйте JSON, чтобы получить из ответа необходимые данные.
Вот пример функции, как это может быть реализовано:
function get_entity_type_via_wp($text_to_analyse, $entity = 'type') {
// Получение ключа API из настроек
$options = get_option('cxt_settings');
$google_nlp_api = $options['cxt_gcloud'];
// Формирование URL API
$url = "https://language.googleapis.com/v1/documents:analyzeEntities?key=" . $google_nlp_api;
// Формирование payload
$payload = json_encode(array(
'document' => array(
'type' => 'PLAIN_TEXT',
'content' => $text_to_analyse
),
'encodingType' => 'UTF8'
));
// Выполнение POST-запроса с использованием wp_remote_post
$response = wp_remote_post($url, array(
'method' => 'POST',
'timeout' => 45,
'headers' => array(
'Content-Type' => 'application/json; charset=utf-8'
),
'body' => $payload
));
// Проверка на наличие ошибок
if (is_wp_error($response)) {
return false; // Обработка ошибки может быть улучшена
}
// Извлечение и обработка ответа
$response_body = wp_remote_retrieve_body($response);
$result = json_decode($response_body, true);
// Извлечение нужной сущности
if (!empty($result['entities'])) {
return $result['entities'][0][$entity];
}
return null;
}
Эта функция призвана более аккуратно взаимодействовать с API, используя встроенные инструменты WordPress, что делает код более надежным и совместимым в пределах экосистемы WordPress.