首页 > 解决方案 > google dialogflow 上的操作 - 使用 Java 的 webhook

问题描述

我使用 Http 请求-响应消息在 C# 中创建了一个 webhook。现在我正在尝试创建一个Java。这就是我返回响应的方式:(基于示例响应模板)

        return s.createResponseBuilder(HttpStatus.OK)
            .body(new JSONObject().put("fulfillmentText", resultText)
                    .put("fulfillmentMessages",
                            new JSONArray().put(new JSONObject().put("simpleResponses",
                                    new JSONObject().put("simpleResponses",
                                            new JSONArray().put(new JSONObject().put("displayText", "display text")
                                                    .put("textToSpeech", "display text")))))
                    .put("payload",
                            new JSONObject().put("google", new JSONObject().put("expectUserResponse", Boolean.TRUE)))
                    .toString())
            .build();

(结果文本是 google 操作中显示的实际结果),这不起作用(尽管我的 c# webhook 返回了确切的 json 并且它工作正常)是否有任何它会在 Java 中喜欢的好的 HttpResponse 模板的模板?

编辑

我尝试使用 Java SDK 提供的类:

        // create simple response
    GoogleCloudDialogflowV2IntentMessageSimpleResponse sr = new GoogleCloudDialogflowV2IntentMessageSimpleResponse();
    sr.setDisplayText("display text");
    sr.setTextToSpeech("text to speech");
    // create list of simple response
    List<GoogleCloudDialogflowV2IntentMessageSimpleResponse> sr_list = new ArrayList<>();
    sr_list.add(sr);
    // set simple_responses
    GoogleCloudDialogflowV2IntentMessageSimpleResponses sr1 = new GoogleCloudDialogflowV2IntentMessageSimpleResponses();
    sr1.setSimpleResponses(sr_list);
    // set intent msg
    GoogleCloudDialogflowV2IntentMessage intentmsg = new GoogleCloudDialogflowV2IntentMessage();
    intentmsg.setSimpleResponses(sr1);
    // set list of intent msgs
    List<GoogleCloudDialogflowV2IntentMessage> intent_list = new ArrayList<>();
    intent_list.add(intentmsg);
    // set up the response
    GoogleCloudDialogflowV2WebhookResponse response = new GoogleCloudDialogflowV2WebhookResponse();
    response.setFulfillmentMessages(intent_list);
    response.setFulfillmentText(resultText);
    Map<String,Object> my_map = new HashMap<String, Object>();
    my_map.put("expectUserResponse", Boolean.TRUE);
    response.setPayload(my_map);

并将该 response.toString 作为 HTTP 响应的正文发送,但这并没有使 Google 上的 dialogflow \ 操作更了解我:/

编辑 2.0

在对话框流上运行时,我得到了响应: 在此处输入图像描述 但是,使用具有相同 URL 和参数的 Postman 调用它: 这是对话框流得到的响应,由于某种原因,他似乎不理解它(在 VS 代码中对齐)

编辑 3.0

宣言:

public HttpResponseMessage run(
    @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> s,
    final ExecutionContext c) {

标签: javahttpdialogflow-esactions-on-google

解决方案


我对您的运行时环境(Azure 上的 Java?使用 Microsoft 的 Azure 包com.microsoft.azure.functions?)不够熟悉,无法弄清楚到底发生了什么,但看起来您的HttpResponseMessage.Builder实例没有正确编码主体,或者没有设置响应时清除编码。

具体来说,我怀疑charset最终会变成 UTF-16 或类似的东西。我会确保您将其强制为 UTF-8。


推荐阅读