从Form Flow获取数据并将其输入到api调用中

时间:2018-05-01 07:46:33

标签: c# botframework luis formflow

我坚持从使用表单流创建的表单中获取变量值。我想要用户的这四个过滤器,以便我可以在我的API调用中插入它们并返回一个JSON对象。

在此代码中,过滤器是在URL中手动指定的,仅用于说明目的。

当我运行此代码时,首先执行API调用,然后表单出现在Bot框架模拟器上。

[LuisIntent("ProductSearch")]
public async Task ProductSearch(IDialogContext context, LuisResult result)
{
    if (result.TryFindEntity("SearchKeyword", out EntityRecommendation SearchKeywordEntity))
    {
        await context.PostAsync($"Searching for '{SearchKeywordEntity.Entity}'...");

        Enquiry enqform = new Enquiry();
        FormDialog<Enquiry> Enquiryform = new FormDialog<Enquiry>(enqform, Enquiry.BuildEnquiryForm, FormOptions.PromptInStart);
        context.Call(Enquiryform, EnquiryFormSubmitted);

        ApiCall api = new ApiCall();
        string json = ApiCall.GET($"http://127.0.0.1:5000/search?search_keyword=water&av_filter=Asia&in_filter=Chemicals&aa_filter=Home Care&pg_filter=Polymers");
        await context.PostAsync(json);
    }
}

这是Enquiry.cs

using Microsoft.Bot.Builder.FormFlow;
using System;

namespace BASF_Bot_Application2.Dialogs
{
    [Serializable]
    public class Enquiry
    {
        [Prompt("Would you like to apply some filters to get more specific results? {||}")]
        public bool ApplyFilters { get; set; }

        [Prompt("Where do yo want the product? {||}")]
        public Availability AvailabilityRequired { get; set; }
        public enum Availability
        {
            Global, Africa, Asia, Australia, Europe, North_America, South_America
        }

        [Prompt("What industry would you prefer? {||}")]
        public Industries IndustriesRequired { get; set; }
        public enum Industries
        {
            Agriculture, Automotive & Transportation, Chemicals, Construction, Electronics & Electrics, Energy & Resources, Furniture & Wood, Home Care and I&I Cleaning, Nutrition, Packaging & Print, Paint & Coatings Industry, Personal Care & Hygiene, Plastics & Rubber, Pulp & Paper, Textile, Leather & Footwear
        }

        [Prompt("Where is the Area of Application? {||}")]
        public Areas_of_Application Areas_of_ApplicationRequired { get; set; }
        public enum Areas_of_Application
        {
            Ag Chem Additives, Cleaning and caring, Construction, Electronics, Food and Beverage, Formulation Technologies, Health, Home and Garden, Home Care, Industrial and Institutional Cleaning, Information technology, Manufacturing, Measuring and control technol., Packaging, Paper and Printing
        }

        public static IForm<Enquiry> BuildEnquiryForm()
        {
            return new FormBuilder<Enquiry>()
                .Field("ApplyFilters")
                .Field("AvailabilityRequired")
                .Field("Industries")
                .Field("Areas_of_Application")
                .Build();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

用户完成/填写表单后,系统会触发EnquiryFormSubmitted,这样您就可以获得用户输入的值以及应该拨打API的位置。

private async Task EnquiryFormSubmitted(IDialogContext context, IAwaitable<Enquiry> result)
    {            
        var enquiry = await result;
        //All the user entered details are available in the enquiry object.
        ApiCall api = new ApiCall();
        string parameters = $"search_keyword=water&av_filter={enquiry.Availability}&in_filter={enquiry.Industries}&aa_filter={enquiry.Areas_of_Application}&pg_filter=Polymers";
        string json = ApiCall.GET($"http://127.0.0.1:5000/search?" + parameters);
        await context.PostAsync(json);
        //Whatever more logic is required
    }