POST主体,用于使用Microsoft BotConnector发送新消息

时间:2016-06-22 11:01:11

标签: android json bots botframework botconnector

REST api在发送消息时详细说明了POST主体的JSON格式,但是不清楚字段中的内容。这是格式......

{
  "id": "string",                         // ?
  "conversationId": "string",             // Conversation ID
  "created": "2016-06-22T10:45:48.618Z",  // Current time?
  "from": "string",                       // Username?
  "text": "string",                       // The message to be sent
  "channelData": "string",                // ?
  "images": [
    "string"                              // Image URL?
  ],
  "attachments": [
    {
      "url": "string",                    // Attachment URL
      "contentType": "string"             // ContentType
    }
  ],
  "eTag": "string"                        // ?
}

我已经标记了我不确定的领域。目前,我发送请求并获得500服务器错误作为回报。该机器人使用本地僵尸模拟器在本地工作正常。

此JSON需要在Android应用中构建。

编辑:以下是截获的JSON和我发送的回复

POST https://directline.botframework.com/api/conversations/D0I7X8284zv/messages HTTP/1.1
Host: directline.botframework.com
Connection: keep-alive
Content-Length: 239
Authorization: BotConnector Ve7jitnSIdE.dAA.RAAwAEkANwBYADgAMgA4ADQAegB2AA.Iy0ZhjLN0QE.e9o7v6n2Xz4.8C7zj2UlOP6202jMEpHqjXVfZxexO5JxzFE7VrRgaXg
Postman-Token: dd7b4c43-84ea-7c38-bd2c-681f6c031eb0
Cache-Control: no-cache
Origin: chrome-extension://aicmkgpgakddgnaphhhpliifpcfhicfo
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6,fr;q=0.4
Cookie: XXXXXXXXXXXXXXXXXXXXX

{
  "id": "SomeId",
  "conversationId": "D0I7X8284zv",
  "created": "2016-06-23T09:05:06.718Z",
  "from": "someusername",
  "text": "annual leave",
  "channelData": "Conv1",
  "images": [],
  "attachments": [],
  "eTag": "blah"
}
HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 43
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
Set-Cookie: UserId=XXXXXXXXXXXXXXXXXXXXXXX; path=/
Access-Control-Allow-Origin: *
X-Powered-By: ASP.NET
Strict-Transport-Security: max-age=31536000
Date: Thu, 23 Jun 2016 09:06:06 GMT

{
  "message": "failed to send message"
}

1 个答案:

答案 0 :(得分:0)

在JSON中,text是用户发送给bot的消息。当我使用直接线路API启用网络聊天时出现500错误。但它会在5或6个小时后自动解决。

顺便提一下,根据微软的帮助,他们给了我这两个选项, Direct Line将在两种情况下返回错误:

  1. 您的消息存在问题或直接线路内部错误
  2. 您的机器人正在返回错误消息
  3. 正如您所提到的,在模拟器中它可以正常工作。所以这是因为你传递的信息。

    Message {
    id (string, optional): ID for this message ,
    conversationId (string, optional): Conversation ID for this message ,
    created (string, optional): UTC timestamp when this message was created ,
    from (string, optional): Identity of the sender of this message ,
    text (string, optional): Text in this message ,
    channelData (string, optional): Opaque block of data passed to/from bot via the ChannelData field ,
    images (Array[string], optional): Array of URLs for images included in this message ,
    attachments (Array[Attachment], optional): Array of non-image attachments included in this message ,
    eTag (string, optional)
    }
    Attachment {
    url (string, optional): URL for this attachment ,
    contentType (string, optional): Content type for this attachment 
    } 
    
    Conversation {
    conversationId (string, optional): ID for this conversation ,
    token (string, optional): Token scoped to this conversation ,
    eTag (string, optional)
    } 
    

    这里与我分享C#代码,可能会对你有帮助,

     private async Task<bool> PostMessage(string message)
            {
    
                client = new HttpClient();
                client.BaseAddress = new Uri("https://directline.botframework.com/api/conversations/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", "[YOUR BOT TOKEN]");
                response = await client.GetAsync("/api/tokens/");
                if (response.IsSuccessStatusCode)
                {
                    var conversation = new Conversation();
                    response = await client.PostAsJsonAsync("/api/conversations/", conversation);
                    if (response.IsSuccessStatusCode)
                    {
                        Conversation ConversationInfo = response.Content.ReadAsAsync(typeof(Conversation)).Result as Conversation;
                        string conversationUrl = ConversationInfo.conversationId+"/messages/";
                        BotDirectLineApproch.Models.Message msg = new BotDirectLineApproch.Models.Message() { text = message };
                        response = await client.PostAsJsonAsync(conversationUrl,msg);
                        if (response.IsSuccessStatusCode)
                        {
                            response = await client.GetAsync(conversationUrl);
                            if (response.IsSuccessStatusCode)
                            {
                                MessageSet BotMessage = response.Content.ReadAsAsync(typeof(MessageSet)).Result as MessageSet;
                                ViewBag.Messages = BotMessage;
                                IsReplyReceived = true;
                            }
                        }
                    }
    
                }
                return IsReplyReceived;
            }
    

    我创建了一个具有相同JSON的类,如下所示,

    public class MessageSet
        {
            public Message[] messages { get; set; }
            public string watermark { get; set; }
            public string eTag { get; set; }
        }
    
        public class Message
        {
            public string id { get; set; }
            public string conversationId { get; set; }
            public DateTime created { get; set; }
            public string from { get; set; }
            public string text { get; set; }
            public string channelData { get; set; }
            public string[] images { get; set; }
            public Attachment[] attachments { get; set; }
            public string eTag { get; set; }
        }
    
        public class Attachment
        {
            public string url { get; set; }
            public string contentType { get; set; }
        }
    

    对于对话,

    public class Conversation
        {
            public string conversationId { get; set; }
            public string token { get; set; }
            public string eTag { get; set; }
        }
    

    我希望这个答案可以帮助您解决问题。 干杯!