Как я могу сделать http-вызов DialogFlow V2, используя простой jjuery ajax? - PullRequest
0 голосов
/ 01 июня 2018

Я использовал DialogFlow v1, прежде чем использовать просто jquery, и это было довольно прямолинейно!

Теперь, когда мне нужно переключиться на V2, я застрял в том, как сохранить какой-то код, но просто изменить с помощьюV2!

Я искал эту клиентскую библиотеку для V2: https://github.com/dialogflow/dialogflow-nodejs-client-v2#using-the-client-library

Но я не хочу использовать Node.js. Я просто не хочу делать что-то вроде узла server.js для запускаприложение, также я не уверен, смогу ли я смешать jQuery с Node.js.

Мой предыдущий код v1 выглядел так:

fetch(url, {
    body: JSON.stringify(data),
    // cache: 'no-cache',
    // credentials: 'same-origin',
    headers: {
        'content-type': 'application/json',
        "Authorization": "Bearer " + configs.accessToken,
    },
    method: 'POST',
    mode: 'cors',
    redirect: 'follow',
    referrer: 'no-referrer',
})
    .then(response => response.json()) // parses response to JSON

Хорошо, я перешел на ES6 для выполнения запроса httpдля диалогового потока, но я хотел бы, чтобы тот же код использовать для V2, это возможно?Также я больше не вижу токен доступа для v2, как мы должны обрабатывать аутентификацию для вызовов http?

Я действительно запутался с новой версией V2, и, поскольку мы перешли на учетную запись Enterprise Edition, нам необходимо использовать v2, и это своего рода отстой!

Редактировать: я проверяю этот пример издокументация:

  POST https://dialogflow.googleapis.com/v2beta1/projects/project-name/agent/intents

    Headers:
    Authorization: Bearer $(gcloud auth print-access-token)
    Content-Type: application/json

    POST body:
    {
        'displayName': 'StartStopwatch',
        'priority': 500000,
        'mlEnabled': true,
        'trainingPhrases': [
            {
                'type': 'EXAMPLE',
                'parts': [
                    {
                        'text': 'start stopwatch'
                    }
                ]
            }
        ],
        'action': 'start',
        'messages': [
            {
                'text': {
                    'text': [
                        'Stopwatch started'
                    ]
                }
            }
        ],
    }

Но я как-то запутался в этой части: Authorization: Bearer $(gcloud auth print-access-token) где я могу получить токен доступа?

Я уже сделал эту часть: gcloud auth activit-service-account --key-file =, которую я понятия не имею, что он делает после активации!Я надеялся получить от этого какой-нибудь токен доступа, но, похоже, ничего нет, кроме сообщения, в котором говорится об активированной службе ...

1 Ответ

0 голосов
/ 11 сентября 2018

Прежде всего, Dialogflow V1 API не скоро исчезнет.У них нет определенной временной шкалы, чтобы остановить API.В случае, если они решили, разработчики будут уведомлены с крайним сроком (подтвержденным их командой поддержки).Я думаю, что вы должны быть в порядке до тех пор.

Однако, если вы решили использовать Dialogflow V2 API с браузером AJAX, как и V1, простого способа нет, если у вас нет токена доступа.Я столкнулся с той же проблемой и понял, что это невозможно сделать без использования их клиентских библиотек (SDK) или "google-oauth-jwt".В моем примере я использовал пакет nodejs - google-oauth-jwt, который предоставляет «токен доступа» для моего приложения, которое использовалось для вызовов браузера AJAX.Вам не нужно использовать их библиотеку nodejs SDK, в случае, если вы обрабатываете логику на стороне клиента.

Инструкции по установке:

1.Настройка V2 API из V1 в учетной записи диалогового потокаследуйте руководству по миграции.Загрузите файл JSON с уникальными значениями электронной почты и ключей.Возможно, вы захотите предоставить доступ к вашему приложению, зарегистрировав домены.

2. Создайте приложение nodejs и используйте «google-oauth-jwt» для получения токена доступа.Кроме того, сделайте это как службу, чтобы вызывать ее заранее, чтобы токен доступа был готов перед выполнением любых вызовов AJAX.Вот пример кода:

app.get("/your_sample_web_service_to_get_access_token", (req, res, next) => {
new Promise((resolve) => {
    tokens.get({
            //find this email value from the downloaded json
            email: 'xxx@xxx.iam.gserviceaccount.com',
            //find this key value from the downloaded json
            key: '-----BEGIN PRIVATE KEY-----xxx',
            //specify the scopes you wish to access: as mentioned in dialogflow documentation
            scopes: ['https://www.googleapis.com/auth/cloud-platform']
        },
        (err, token) => {
            //rest api response
            res.json({
                "access_token": token
            });
            resolve(token);
        }
    );
});
});

3.В своем клиентском JavaScript сделайте AJAX-вызов, используя токен доступа, который вы получили из вышеуказанного приложения nodejs.Вот пример кода:

app.service('chatbot', function ($http, $rootScope) {
    this.callAPI = function (user_entered_query) {
        //I used detectintent REST API endpoint: find the project name from your account.
        var endpoint = "https://dialogflow.googleapis.com/v2/projects/xxx/agent/sessions/123456789:detectIntent";
        var data = JSON.stringify({queryParams:{}, query_input:{text:{text:user_entered_query,language_code:"en-US"}},outputAudioConfig:{},inputAudio:""});
        var headers = {
            //use the token from nodejs service
            "Authorization": "Bearer " +$rootScope.token
        };
        return $http.post(_url, _data, {"headers": headers});
    }
});
...