directline v3给出错误400

时间:2017-06-01 10:18:36

标签: python python-requests botframework direct-line-botframework

在步骤向僵尸程序发送活动根据文档在此处

https://docs.botframework.com/en-us/restapi/directline3/#navtitle

我应该将此作为帖子请求的正文内容传递

{
  "type": "message",
  "from": {
    "id": "user1"
  },
  "text": "hello"
}

我使用以下参数在python中发出POST请求,但它无效。

msg = {"type": "message","channelId": "directline","conversation":{"id": str(convId)},"from":{"id": "test_user1"},"text": "hello"}
header = {"Authorization":"Bearer q1-Tr4sRrAI.cwA.BmE.n7xMxGl-QLoT7qvJ-tNIcwAd69V-KOn5see6ki5tmOM", "Content-Type":"application/json", "Content-Length": "512"}
send2 = "https://directline.botframework.com/v3/directline/conversations/"+str(convId)+"/activities"
rsa1 = requests.post(send2,data=msg, headers=header)

这给了我这个错误:

{
  "error": {
  "code": "MissingProperty",
  "message": "Invalid or missing activities in HTTP body"
   }
} 

在此步骤之前,一切正常。

编辑1:即使我添加了代码中更新的内容长度,也会出现相同的错误

编辑2:如果我将msg更改为json.dumps(msg)

rsa1 = requests.post(send2,data=json.dumps(msg), headers=header)

我得到回应:

{u'error': {u'message': u'Failed to send activity: bot returned an error', u'code': u'ServiceError'}}
{
  "error": {
    "code": "ServiceError",
    "message": "Failed to send activity: bot returned an error"
  }
}

直接API只是不起作用,在Skype客户端上一切正常。

2 个答案:

答案 0 :(得分:0)

根据您发布的代码,您的请求正文如下:

{
    "type": "message",
    "channelId": "directline",
    "conversation": {
        "id": str(convId)
    },
    "from": {
        "id": "test_user1"
    },
    "text": "hello"
}

我怀疑您的错误是由于您在请求正文中包含的会话ID值未被JSON中的双引号包围而导致的错误丝。

为简单起见(并消除您收到的错误),我建议您尝试省略 channelId 属性和会话属性来自请求正文,因为我不相信这些属性中的任何一个都是必需的(即,您要向Direct Line URI发出请求,因此Bot Framework知道Direct Line是通道,对话ID已在请求URI中指定。换句话说,请尝试将此作为您的请求正文:

{
    "type": "message",
    "from": {
        "id": "test_user1"
    },
    "text": "hello"
}

答案 1 :(得分:0)

将字典传递给data时,它会自动进行urlencoded,因此api会返回错误,因为它需要json数据。

您可以使用json lib,也可以将字典传递给json参数。
 使用json.dumps

rsa1 = requests.post(send2, data=json.dumps(msg), headers=header)

仅使用requests

rsa1 = requests.post(send2, json=msg, headers=header)

此外,您不必添加" Content-Length"在header中,如果您使用第二个示例,则不必添加" Content-Type"任