2017-03-09 78 views
0

我是Azure Bot編程(C#)的新手,無法在此主題上找到好的文章。從Azure Bot調用WebAPI

我想讓用戶'訂閱'使用Bot的郵件列表。我建立了一個Form對話框和Form Flow。它要求用戶提供他們的電子郵件地址。

我需要做的是發佈到外部WebAPI(json)並獲得響應並處理響應。

有人可以給我一些關於如何從機器人調用WebAPI的指針嗎?

public async Task Subscribe(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 
     context.Call(SubscribeForm.BuildFormDialog(FormOptions.PromptInStart), SubscribeFormComplete); 
    } 

    private async Task SubscribeFormComplete(IDialogContext context, IAwaitable<SubscribeForm> result) 
    { 
     try 
     { 
      var form = await result; 
      if (form != null) 
      { 
       await context.PostAsync("Thanks for subscribing! You can always remove yourself by typing unsubscribe."); 
      } 
      else 
      { 
       await context.PostAsync("Form returned empty response!"); 
      } 
     } 
     catch (OperationCanceledException) 
     { 
      await context.PostAsync("I am sorry you decided not to subscribe! If you change your mind just type 'subscribe' again."); 
     } 

     context.Wait(this.MessageReceived); 
    } 


     [Serializable] 
public class SubscribeForm 
{ 
    [Prompt("What is your email address?")] 
    [Required()] 
    [DataType(DataType.EmailAddress)] 
    public string EmailAddress { get; set; } 

    public static IForm<SubscribeForm> BuildForm() 
    { 
     // Builds an IForm<T> based on BasicForm 
     return new FormBuilder<SubscribeForm>() 
      .Message("We often send out updates on new features. We don't spam. You can type 'quit' to cancel this.") 
      .Build(); 
    } 

    public static IFormDialog<SubscribeForm> BuildFormDialog(FormOptions options = FormOptions.PromptInStart) 
    { 
     // Generated a new FormDialog<T> based on IForm<BasicForm> 
     return FormDialog.FromForm(BuildForm, options); 
    } 
} 
+0

從一個機器人做的時候,爲什麼會是不同的?您可以像平常一樣提出請求。 – stuartd

+0

機器人和表單流向他們有'堆棧'和父母/孩子的細微差別。只需尋找有關WebAPI調用的代碼放置位置的建議即可。例如在formcompleted方法或其他地方,以及如何處理異步和回調。 – user3637002

回答

2

這是我如何調用Microsoft的認知服務LUIS的示例,我對靜態類有方法,而且方法是異步的。

方法:

public static class CognitiveHelper 
    { 
     private const string UrlLuis = "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/a267a797-9584-41a5-83f3-xxxxxxxxx?subscription-key=xxxxxxxxxxxxxxxxxxxxxxx&q="; 
    public static async Task<LuisObjects> GetLuisAnswer(string textToEvaluate) 
      { 
       if (string.IsNullOrWhiteSpace(textToEvaluate)) throw new ArgumentException("Null argument"); 

       textToEvaluate= HttpUtility.UrlEncode(textToEvaluate); 
       var urlLuisWithRequest = UrlLuis + textToEvaluate; 

       var client = new HttpClient(); 
       var body = new { }; 

       var serializedBody = new JavaScriptSerializer().Serialize(body); 
       byte[] bodyByte = Encoding.UTF8.GetBytes(serializedBody); 

       using (var content = new ByteArrayContent(bodyByte)) 
       { 
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
        var response= await client.GetAsync(urlLuisWithRequest); 
        var responseContent= await respuesta.Content.ReadAsStringAsync(); 

        var javaScriptSerializer = new JavaScriptSerializer(); 
        var resultTextAnalysis= javaScriptSerializer.Deserialize<LuisResult>(responseContent); 
        return new LuisObjects() 
        { 
         Entities= resultTextAnalysis.entities.ToList(), 
         TopScoringIntent = resultTextAnalysis.topScoringIntent 
        }; 
       } 
      } 
} 

電話:

var luisResponse = await CognitiveHelper.GetLuisAnswer(activity.Text);