FormFlow 是 Microsoft Bot Framework 中的一个功能,它允许开发者通过对话形式引导用户完成表单填写。当需要将收集到的表单数据传递给外部 API 时,需要了解以下核心概念:
首先定义一个模型类来表示表单数据:
[Serializable]
public class OrderForm
{
[Prompt("What product would you like to order?")]
public string ProductName { get; set; }
[Prompt("How many units do you need?")]
public int Quantity { get; set; }
[Prompt("Please provide your shipping address")]
public string Address { get; set; }
public static IForm<OrderForm> BuildForm()
{
return new FormBuilder<OrderForm>()
.Message("Welcome to the ordering bot!")
.OnCompletion(async (context, order) =>
{
// 表单完成后执行的操作
await ProcessOrderAsync(context, order);
})
.Build();
}
}
创建一个方法来处理表单数据并调用外部 API:
private static async Task ProcessOrderAsync(IDialogContext context, OrderForm order)
{
try
{
// 创建 HTTP 客户端
using (var client = new HttpClient())
{
// 设置 API 基础地址
client.BaseAddress = new Uri("https://api.example.com/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// 将表单数据序列化为 JSON
var json = JsonConvert.SerializeObject(order);
var content = new StringContent(json, Encoding.UTF8, "application/json");
// 发送 POST 请求
HttpResponseMessage response = await client.PostAsync("orders", content);
if (response.IsSuccessStatusCode)
{
await context.PostAsync("Your order has been successfully submitted!");
}
else
{
await context.PostAsync("There was an error processing your order. Please try again later.");
}
}
}
catch (Exception ex)
{
await context.PostAsync($"An error occurred: {ex.Message}");
}
}
在消息控制器中启动 FormFlow:
[Serializable]
public class RootDialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
if (message.Text.ToLower().Contains("order"))
{
// 启动 FormFlow
var orderForm = FormDialog.FromForm(OrderForm.BuildForm, FormOptions.PromptInStart);
context.Call(orderForm, ResumeAfterOrderForm);
}
else
{
await context.PostAsync("Hi! Type 'order' to start an order.");
context.Wait(MessageReceivedAsync);
}
}
private async Task ResumeAfterOrderForm(IDialogContext context, IAwaitable<OrderForm> result)
{
// 表单完成后可以执行其他操作
context.Wait(MessageReceivedAsync);
}
}
原因:外部 API 处理时间过长,超过了 Bot Framework 的默认超时设置
解决方案:
var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(30) // 设置为30秒
};
原因:缺少必要的认证头或令牌
解决方案:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your-access-token");
原因:模型类与 API 期望的数据结构不匹配
解决方案:
var apiDto = new OrderApiDto
{
Product = order.ProductName,
Qty = order.Quantity,
DeliveryAddress = order.Address
};
var json = JsonConvert.SerializeObject(apiDto);
通过以上方法,您可以有效地将 BotFramework FormFlow 收集的数据传递给外部 API,实现端到端的业务流程自动化。