首页 文章

Dialogflow无法解析来自我的webhook的JSON响应似乎改变了字符编码

提问于
浏览
1

我有一个实现webhook,我试图用它来返回对Dialogflow上的测试意图的简单响应 .

webhook是一个天蓝色的功能,并使用邮差测试它我可以看到JSON响应正确格式化正确的 Headers 等 .

这是Dialogflow向我显示的原始响应错误(向右滚动以查看消息上的错误)

{
  "responseId": "6d2686c1-a87b-4f64-ac4d-f3a5e706763c",
  "queryResult": {
    "queryText": "Test",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/mytestappname-c0f76/agent/intents/3d70ef1d-9723-451f-b79d-b40f4e16d8b0",
      "displayName": "Test"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {
      "webhook_latency_ms": 600
    },
    "languageCode": "en"
  },
  "webhookStatus": {
    "code": 3,
    "message": "Webhook call failed. Error: Failed to parse webhook JSON response: Expect message object but got: \"笀∀昀漀氀氀漀眀甀瀀䔀瘀攀渀琀䤀渀瀀甀琀∀㨀渀甀氀氀Ⰰ∀昀甀氀昀椀氀氀洀攀渀琀䴀攀猀猀愀最攀猀∀㨀嬀笀∀戀愀猀椀挀䌀愀爀搀∀㨀渀甀氀氀Ⰰ∀挀愀爀搀∀㨀渀甀氀氀Ⰰ∀挀愀爀漀甀猀攀氀匀攀氀攀挀琀∀㨀渀甀氀氀Ⰰ∀椀洀愀最攀∀㨀渀甀氀氀Ⰰ∀氀椀渀欀伀甀琀匀甀最最攀猀琀椀漀渀∀㨀渀甀氀氀Ⰰ∀氀椀猀琀匀攀氀攀挀琀∀㨀渀甀氀氀Ⰰ∀瀀愀礀氀漀愀搀∀㨀渀甀氀氀Ⰰ∀瀀氀愀琀昀漀爀洀∀㨀渀甀氀氀Ⰰ∀焀甀椀挀欀刀攀瀀氀椀攀猀∀㨀渀甀氀氀Ⰰ∀猀椀洀瀀氀攀刀攀猀瀀漀渀猀攀猀∀㨀渀甀氀氀Ⰰ∀猀甀最最攀猀琀椀漀渀猀∀㨀渀甀氀氀Ⰰ∀琀攀砀琀∀㨀笀∀琀攀砀琀∀㨀嬀∀吀栀椀猀 椀猀 愀 昀甀氀昀椀氀氀洀攀渀琀 洀攀猀猀愀最攀∀崀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀崀Ⰰ∀昀甀氀昀椀氀氀洀攀渀琀吀攀砀琀∀㨀∀吀栀椀猀 椀猀 昀甀氀昀椀氀氀洀攀渀琀 琀攀砀琀∀Ⰰ∀漀甀琀瀀甀琀䌀漀渀琀攀砀琀猀∀㨀渀甀氀氀Ⰰ∀瀀愀礀氀漀愀搀∀㨀笀∀最漀漀最氀攀∀㨀笀∀攀砀瀀攀挀琀唀猀攀爀刀攀猀瀀漀渀猀攀∀㨀琀爀甀攀Ⰰ∀爀椀挀栀刀攀猀瀀漀渀猀攀∀㨀笀∀椀琀攀洀猀∀㨀嬀笀∀搀椀猀瀀氀愀礀吀攀砀琀∀㨀渀甀氀氀Ⰰ∀猀猀洀氀∀㨀渀甀氀氀Ⰰ∀琀攀砀琀吀漀匀瀀攀攀挀栀∀㨀∀吀栀椀猀 椀猀 䐀愀瘀攀✀猀 吀攀猀琀椀渀最 吀攀砀琀∀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀崀紀Ⰰ∀昀椀渀愀氀刀攀猀瀀漀渀猀攀∀㨀笀∀椀琀攀洀猀∀㨀嬀笀∀搀椀猀瀀氀愀礀吀攀砀琀∀㨀渀甀氀氀Ⰰ∀猀猀洀氀∀㨀渀甀氀氀Ⰰ∀琀攀砀琀吀漀匀瀀攀攀挀栀∀㨀∀吀栀椀猀 椀猀 䐀愀瘀攀✀猀 䘀椀渀愀氀 吀攀猀琀椀渀最 吀攀砀琀∀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀崀紀紀紀Ⰰ∀猀漀甀爀挀攀∀㨀∀攀砀愀洀瀀氀攀⸀挀漀洀∀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀\"."
  }
}

然而,在同一窗口中,它向我展示了我的实际完整反应是什么

{
  "followupEventInput": null,
  "fulfillmentMessages": [
    {
      "basicCard": null,
      "card": null,
      "carouselSelect": null,
      "image": null,
      "linkOutSuggestion": null,
      "listSelect": null,
      "payload": null,
      "platform": null,
      "quickReplies": null,
      "simpleResponses": null,
      "suggestions": null,
      "text": {
        "text": [
          "This is a fulfillment message"
        ],
        "ETag": null
      },
      "ETag": null
    }
  ],
  "fulfillmentText": "This is fulfillment text",
  "outputContexts": null,
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "displayText": null,
            "ssml": null,
            "textToSpeech": "This is Dave's Testing Text",
            "ETag": null
          }
        ]
      },
       "finalResponse": {
        "items": [
          {
             "displayText": null,
             "ssml": null,
            "textToSpeech": "This is Dave's Final Testing Text",
            "ETag": null
           }
        ]
      }
    }
  },
  "source": "example.com",
  "ETag": null
}

这些是响应中的 Headers

“Content-Type”:“application / json; charset = utf-8”,“Date”:“Wed,30 May 2018 07:58:36 GMT”,“Server”:“Kestrel”,“Transfer-Encoding”: “分块”,

我通过验证器放置了响应,它绝对是有效的JSON .

问题不在于响应JSON的内容,我可以稍后解决,如果它不正确,问题是它甚至无法开始解析它 .

有没有人知道为什么Dialogflow根本无法读取它?

2 回答

  • 1

    我得到了同样的错误 . DialogFlow无法解析JSON响应,显示一些奇怪的中文字符 . 就像你说的那样,履行响应标签会显示我发回的信息!

    唯一的区别是我没有使用Azure功能 . 我的webhook是一个.NET Core 2 Web Api,我正在返回一个肯定会产生有效JSON响应的OkObjectResult .

    我还没弄清楚为什么但是我设法让DialogFlow通过不返回一个对象来解析消息但是具有以下内容:

    HttpContext.Response.WriteAsync("{ \"fulfillmentText\" : \"This is a message from my webhook !\" }");
    
  • 1

    根本问题实际上ASP.NET Core默认使用 transfer-encoding: chunked 表示 ActionResult 由于某种原因,Dialogflow不支持解析分块传输(大多数客户端应该透明地处理它) . 您可以通过使用网络调试器查看原始服务器响应来验证这一点 .

    不幸的是,似乎没有一种简单的方法来禁用ASP.NET Core 2中的分块响应(there was in Core 1) .

    解决方法是使用 ContentResult 响应类型,它似乎只返回缓冲响应,因此它不会使用分块传输 . 但显然你需要处理自己的JSON序列化,所以看起来应该是这样的

    [HttpGet]
        public ContentResult Test()
        {
            var response = new()
            {
                Hello = "World"
            };
    
            return Content(JsonConvert.SerializeObject(response), "application/json");
        }
    

相关问题