You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Form Flow表单变量获取与API调用执行顺序问题求助

看起来你遇到的核心问题是API调用在Form Flow表单收集用户输入前就执行了,而且没法把表单里收集到的四个过滤器参数传递到API请求里。我来帮你梳理下解决思路和具体代码调整方案:

核心问题分析

你当前的代码逻辑是在Luis意图方法里直接触发了API调用,但Form Flow的表单交互是异步的——需要先引导用户完成参数输入,再用收集到的参数去发起API请求,而不是反过来。

解决步骤与代码示例

1. 定义Form Flow表单类

首先创建一个类来对应你需要收集的四个过滤器参数,用属性标记每个字段的提示语:

public class ProductSearchFilters
{
    [Prompt("请输入第一个过滤器参数:{||}")]
    public string Filter1 { get; set; }

    [Prompt("请输入第二个过滤器参数:{||}")]
    public string Filter2 { get; set; }

    [Prompt("请输入第三个过滤器参数:{||}")]
    public string Filter3 { get; set; }

    [Prompt("请输入第四个过滤器参数:{||}")]
    public string Filter4 { get; set; }
}

2. 修改Luis意图方法,先启动表单收集参数

调整ProductSearch方法,让它先启动Form Flow表单,把API调用逻辑放到表单完成后的回调里:

[LuisIntent("ProductSearch")]
public async Task ProductSearch(IDialogContext context, LuisResult result)
{
    // 启动Form Flow表单,引导用户输入四个过滤器参数
    var formDialog = new FormDialog<ProductSearchFilters>(new ProductSearchFilters(), ProductSearchForm.BuildForm, FormOptions.PromptInStart);
    context.Call(formDialog, AfterFormCompleted);
}

// 表单完成后的回调方法——在这里执行API调用
private async Task AfterFormCompleted(IDialogContext context, IAwaitable<ProductSearchFilters> result)
{
    try
    {
        // 获取用户在表单里输入的所有过滤器参数
        var filters = await result;

        // 用收集到的参数构建API请求URL(注意转义特殊字符)
        var apiUrl = $"https://your-api-domain.com/search?" +
                     $"filter1={Uri.EscapeDataString(filters.Filter1)}&" +
                     $"filter2={Uri.EscapeDataString(filters.Filter2)}&" +
                     $"filter3={Uri.EscapeDataString(filters.Filter3)}&" +
                     $"filter4={Uri.EscapeDataString(filters.Filter4)}";

        // 发起API请求并获取JSON结果
        using (var httpClient = new HttpClient())
        {
            var apiResponse = await httpClient.GetAsync(apiUrl);
            var jsonResult = await apiResponse.Content.ReadAsStringAsync();

            // 将JSON结果返回给用户
            await context.PostAsync($"已为你完成查询,结果如下:\n{jsonResult}");
        }
    }
    catch (FormCanceledException)
    {
        // 处理用户中途取消表单的情况
        await context.PostAsync("你已取消搜索请求,若需要重新查询请再次触发ProductSearch意图。");
    }
    finally
    {
        context.Done<object>(null);
    }
}

// 用于构建Form Flow表单的静态方法
public static IForm<ProductSearchFilters> BuildForm()
{
    return new FormBuilder<ProductSearchFilters>()
        .Message("请依次提供以下四个过滤器参数:")
        .Build();
}

3. 关键逻辑说明

  • 用context.Call启动表单后,Bot会先和用户完成所有参数的收集,只有当用户提交表单后,才会进入AfterFormCompleted回调方法执行API调用
  • 用Uri.EscapeDataString处理参数可以避免特殊字符导致的URL格式错误
  • 增加了FormCanceledException捕获,处理用户中途取消表单的场景,提升交互体验

内容的提问来源于stack exchange,提问作者partoftheorigin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:58:31