Как преобразовать этот cURL в wp_remote_*?

Вопрос или проблема

Моя функция ниже включает вызов 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-запроса, добавление заголовков, отправка запроса и обработка полученного ответа.

Применение:

  1. Конфигурация запроса:
    Используйте wp_remote_post, чтобы отправить POST-запрос к API. Определите URL API, включив в него ключ API. Определите заголовки и тело запроса, которые будут отправлены.

  2. Настройка параметров:
    Используйте параметры массива в wp_remote_post для передачи заголовков запроса, типа запроса (POST), и времени ожидания. Убедитесь, что заголовок Content-Type установлен на application/json, чтобы API понимало, что вы отправляете данные в формате JSON.

  3. Обработка ответа:
    Как только вы получите ответ, используйте функцию 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.

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

Капча загружается...