【问题标题】:write a http post request to bot framework running on localhost向在 localhost 上运行的 bot 框架编写 http post 请求
【发布时间】:2018-04-30 05:35:04
【问题描述】:

我有一个在 http://localhost:3978/api/messages 上运行的机器人。 我可以使用 http post 请求到机器人的消息传递端点,而不是使用模拟器对其进行调试吗? 如果是这样,我该怎么做?

我正在使用 c# microsoft bot 框架,我是这个应用程序的新手。 我不想使用任何渠道或 DirectLine api,只使用 Httpclient。

【问题讨论】:

  • 不确定我是否理解,但您不能只使用您的网络浏览器吗?
  • 我想使用 httpclient 创建一个控制台应用程序来调用端点。不确定我是否理解您关于使用网络浏览器的问题
  • @torsan API 正在等待 HTTP POST 请求,而不是 GET
  • 我认为 Bot 在双向通信中工作。所以客户端和服务器都打开一个端口进行通信。当客户端发送请求时,它将指向服务器应该发送回调消息的服务器。如果您有兴趣从服务器接收响应,您在这里要求的还需要打开两个通道。
  • @Hane,与机器人框架的通信不像直接调用 REST API 那样简单。当通过某个通道触发消息时,机器人会记录该通道和用户的某些标识,并将消息从通道转换为与通道无关的格式,机器人的代码会接收该格式。该频道和用户也用于发送主动消息。想想看,如果您只是一个 HTTP 客户端,当您不可用时,机器人会将消息发送给谁。您可以使用 Directline API 创建控制台应用程序以与机器人交互。 Directline API 可在 .NET 和 NodeJS 中以 swagger 形式使用。

标签: c# botframework


【解决方案1】:

您可以使用 C# 使用类似于以下的代码来执行此操作。请注意,您必须通过设置满足您需要的适当属性来构造Activity 以发送,此代码中未包含该属性。

//make a call to get an auth token
string token;
using (var client = new WebClient())
{
    var values = new NameValueCollection();
    values["grant_type"] = "client_credentials";
    values["client_id"] = "YOUR APP ID";
    values["client_secret"] = "NcOXRwb51joibEfzUuNE04u";
    values["scope"] = "YOUR APP ID/.default";

    var response =
        client.UploadValues("https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token", values);

    var responseString = Encoding.Default.GetString(response);
    var result = JsonConvert.DeserializeObject<ResponseObject>(responseString);
    token = result.access_token;
}

//you will need to adjust this value for your project.
//this example for a proxy project so the service url here is
//just an arbitrary endpoint I was using to send activities to
activity.ServiceUrl = "http://localhost:4643/api/return";    

var jsonActivityAltered = JsonConvert.SerializeObject(activity);

using (var client = new WebClient())
{
    client.Headers.Add("Content-Type", "application/json");
    client.Headers.Add("Authorization", $"Bearer {token}");

    try
    {
        var btmResponse = client.UploadString("http://localhost:3971/api/messages", jsonActivityAltered);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

【讨论】:

  • 如果客户端 id 和客户端密码来自 bot builder sdk,如果 sdk 未在服务器上发布,他们为您生成随机 id 和密码,我可以自己填充字段吗bot builder sdk 并将相同的内容传递给您在顶部声明的值?
【解决方案2】:

您是否尝试过使用 postman 之类的工具? (它免费且易于使用)

https://www.getpostman.com/

你也可以用postman写脚本

否则,您可以在浏览器中转到 API 的端点

http://localhost:3978/api/

我看到你提到你想制作一个控制台应用程序。

你可以这样做。不过我建议使用邮递员。

这是一个使用 Bearer 令牌发送文件以及一些查询字符串数据和身份验证的示例。

抱歉,可能不准确。如果有的话,必须从一些代码示例中进行一些复制粘贴/删除

        using (HttpClient client = new HttpClient())
        {
            JObject jsonModel = new JObject();
            client.BaseAddress = new Uri("http://localhost:3978/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AuthToken);

                using (var multipartFormDataContent = new MultipartFormDataContent())
                {
                    var values = new[]
                    {
                        new KeyValuePair<string, string>("firstname", lastname),
                        new KeyValuePair<string, string>("lastname", lastname),
                        new KeyValuePair<string, string>("payloadFile", FileName)
                    };

                    foreach (var keyValuePair in values)
                    {
                        multipartFormDataContent.Add(new StringContent(keyValuePair.Value),
                        String.Format("\"{0}\"", keyValuePair.Key));
                    }

                    ByteArrayContent fileContent = new ByteArrayContent(File.ReadAllBytes(HttpContext.Current.Server.MapPath("~/uploads/output/" + FileName)));
                    string FullxmlString = File.ReadAllText(Path.Combine(HttpContext.Current.Server.MapPath("~/uploads/output/" + FileName)));


                    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("payloadFile") { FileName = "payloadFile" };
                    multipartFormDataContent.Add(fileContent);

                    HttpResponseMessage response = client.PostAsync("api/message", multipartFormDataContent).Result;
                    string returnString = response.Content.ToString();

                    using (HttpContent content = response.Content)
                    {
                        string res = "";
                        Task<string> result = content.ReadAsStringAsync();
                        res = result.Result;
                    }
                }
       }

【讨论】:

  • 您的示例中缺少身份验证,您可以添加它吗?
  • 已更新,看看是否有帮助
  • 如果我从 messagescontroller.cs 中删除 [botauthentication],我需要在我的 httpclient 中放入身份验证标头吗?
  • 老实说,我从未使用过机器人身份验证。我认为您所指的身份验证是不记名令牌身份验证,这对于 webAPI 来说是相当标准的
  • 此示例与简单的机器人请求无关
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多