>

봇에 활동 보내기단계에서 여기의 문서에 따라

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

이 내용을 게시 요청의 본문 내용으로 전달해야합니다

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

파이썬에서 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"
  }
}

directline API는 작동하지 않습니다. skype 클라이언트에서는 모든 것이 제대로 작동합니다.

  • 답변 # 1

    게시 한 코드에 따라 요청 본문은 다음과 같습니다.

    {
        "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"
    }
    
    

  • 답변 # 2

    사전을 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)
    
    

    또한 header 에 "Content-Length"를 추가 할 필요가 없습니다  두 번째 예를 사용하면 "Content-Type"도 추가 할 필요가 없습니다.

관련 자료

  • 이전 rest - Android 앱에서 Salesforce에 사례를 만들고 싶습니다
  • 다음 kendo ui angular2 - 그리드 - 상단으로 스크롤?