Как использовать Google.Protobuf.WellknownTypes.Struct в ASP.Net Core - PullRequest
1 голос
/ 10 мая 2019

Я внедряю webhookreceiver в качестве основного веб-приложения ASP.Net для моего агента диалога Google. Для этого я использую пакет nuget Google.Cloud.Dialogflow.V2 (1.0.0-beta02). Когда определенное намерение соответствует Dialogflow, я хочу, чтобы мое веб-приложение ASP вызывало API TMDb для получения информации о специальных фильмах. Я хотел бы отправить эту информацию обратно в Dialogflow как карты Google. Чтобы отправить материал обратно в Dialogflow, я использую класс WebhookResponse (предоставленный Google.Cloud.Dialogflow.V2). Теперь моя проблема заключается в том, как сопоставить шаблон, который ожидает Dialogflow, который выглядит следующим образом:

"messages": [
  {
    "buttons": [
      {
        "postback": "Card Link URL or text",
        "text": "Card Link Title"
      }
    ],
    "imageUrl": "http://urltoimage.com",
    "platform": "facebook",
    "subtitle": "Card Subtitle",
    "title": "Card Title",
    "type": 1
  }
]

На данный момент я обнаружил, что мне нужно, чтобы вышеуказанный Json был частью полезной нагрузки Webhookresponse. (https://github.com/googleapis/google-cloud-dotnet/issues/2425#issuecomment-459885762)

Но сложно сопоставить вышеприведенный шаблон, используя метод, указанный в комментарии Github. Я знаю, что объекты Json (все между парой фигурных скобок) эквивалентны этой строке кода

Value.ForStruct(new Struct { Fields = { ["expectUser"] = Value.ForBool(true) } })

То, что я не могу выяснить, это то, что эквивалентно массиву Json (все между парой квадратных скобок) Я предполагаю, что я должен использовать

Value.ForList()

Но он не скомпилируется, когда я попробую (см. Код ниже, как я это пробовал).

 Payload = new Struct {
               Fields ={["messages"] = Value.ForList(new Struct {
                        Fields = {["buttons"] = Value.ForStruct(new Struct {
                                   Fields = {["postback"] = Value.ForString("Card link url or test"),
                                             ["text"] = Value.ForString("card link title")}
                                   })
                        } })
                }
           }

Предполагается, что этот фрагмент является первыми 8 строками структуры Json из первого кодового блока. (Я попытался отформатировать его настолько хорошо, насколько это возможно, пропущенных скобок не должно быть)

Ошибка в VS2017:

Argument 1: cannot convert from 'Google.Protobuf.WellKnownTypes.Struct' to 'Google.Protobuf.WellKnownTypes.Value'

Кто-нибудь знает, как использовать Google.Protobuf, или может быть другой способ заставить моего агента Dialogflow отображать карточки?

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

A Struct не является Value само по себе - вам нужно использовать Struct.ForValue для создания Value. Это все несколько многословно, но это работает. Тем не менее, похоже, что buttons должен быть другим списком в любом случае. Вот полный пример, который создает исходный JSON для полезной нагрузки:

using Google.Protobuf.WellKnownTypes;
using System;

class Program
{
    static void Main(string[] args)
    {
        var button = Value.ForStruct(new Struct
        {
            Fields =
            {
                ["postback"] = Value.ForString("Card Link URL or text"),
                ["text"] = Value.ForString("Card Link Title")
            }
        });
        var message = Value.ForStruct(new Struct
        {
            Fields =
            {
                ["buttons"] = Value.ForList(button),
                ["imageUrl"] = Value.ForString("http://urltoimage.com"),
                ["platform"] = Value.ForString("facebook"),
                ["subtitle"] = Value.ForString("Card Subtitle"),
                ["title"] = Value.ForString("Cart Title"),
                ["type"] = Value.ForNumber(1)
            }
        });
        var payload = new Struct { Fields = { ["messages"] = Value.ForList(message) } };
        Console.WriteLine(payload);
    }
}

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

1 голос
/ 13 мая 2019

Хорошо, благодаря ответу Джона Скитса, я смог получить правильный формат для WebhookResponse, но он не сработал, как я думал.Диалоговому потоку необходимо получить информацию для отображения карты через атрибут FulfillmentMessages, который доступен только для чтения.Мой обходной путь - вообще не использовать класс WebhookResponse и просто отправить обратно строку JSON, которую я собрал сам.Строка, которую я посылаю обратно, выглядит так:

    string testResponse = @"{
  ""fulfillmentText"": ""This is a text response"",
  ""fulfillmentMessages"": [
    {
                ""card"":
                {
                    ""title"": ""card title"",
                    ""subtitle"": ""card text"",
                    ""imageUri"": ""https://assistant.google.com/static/images/molecule/Molecule-Formation-stop.png"",
                    ""buttons"": [
                    {
                        ""text"": ""button text"",
                        ""postback"": ""https://assistant.google.com/""
                    }]
                }
    }]
}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...