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
相关产品推荐
相关产品推荐

