如何使用 QnA Maker 的 REST API 来使用本机 JavaScript 更新我的知识库?

How to consume the REST API of QnA Maker to update my Knowledge Base using native JavaScript?

我正在尝试消费 Azure REST API to update the Knowledge Base I created via QnA Maker. There's a link there to go to the API testing console

我正在尝试使用下面的代码将我的知识库中的内容替换为从不同数据源中提取的内容。请参阅下面的代码。 希望它有意义

function synchronize() {

    var jsonData = {
        "add": {
            "qnaList":[
                {"source": "Custom"},
                {"answer": "Hello"},
                {"questions": ["Hi", "Hello"]}
            ],
        },
        "delete": {
            "sources": ["Custom"]
        },
        "update": {}
    }   

    var request = new XMLHttpRequest();    
    var parameters = {
        "body": jsonData
    }
    request.open("POST", "https://qnawcfaq.azurewebsites.net/qnamaker/knowledgebases/{kbId}}/generateAnswer", true);                    
    request.setRequestHeader("Authorization", "EndpointKey {key}}");
    request.setRequestHeader("Content-type", "application/json");                    
    request.onreadystatechange = function () { //Call a function when the state changes.
        if (request.readyState == 4 && request.status == 200) {
            alert(request.responseText);
        }
    }

    request.send(JSON.stringify(parameters));
}

我期待如下内容:

{
  "operationState": "NotStarted",
  "createdTimestamp": "2018-03-19T07:38:46Z",
  "lastActionTimestamp": "2018-03-19T07:39:29Z",
  "userId": "86bb8390-56c0-42c2-9f81-3de161981191",
  "operationId": "03a4f4ce-30a6-4ec6-b436-02bcdf6153e1"
}

但是,我收到以下错误:

{
  "error": {
    "code": "BadArgument",
    "message": "Authorization"
  }
}

我在 Ocp-Apim-Subscription-Key 中使用的值对他们的 API 测试控制台有效,但它不适用于上面的代码。知道我在这里遗漏了什么吗?

谢谢!

Working Solution Uploaded in Github: Solution

更新1: 再次阅读问题后,提问者想要创建一个QnAMaker 对,而不仅仅是查询它。 QnAMaker API 的文档并不是很好,并且在某些方面已经过时或令人困惑。因此,我分享了这两种情况的提示。

场景 1:创建 QnAMaker 对

创建 QnAMaker 对有点困难,我建议从 C# Sample and its Program.cs. From there you can tansform it to java script. The documentation has samples for other languages as well, e.g. for nodejs.

开始

提示: 运行 Fiddler 在您执行示例的同时。通过这种方式,您可以通过呼叫和端口检查邮递员或作曲家的呼叫以进行测试。

根据原题,正确的调用是这样的:

// Replace {key} with your QnAMaker endpoint key 
// and {kbId} with the id of the knowledgebase you want to upgrade.

function synchronize() {
    var jsonData = {
        qnaList: [
          {
            id: 0,
            answer: 'Hello',
            source: 'Custom Editorial',
            questions: [
              'Hi','Hello'
            ],
            metadata: [
              {
                name: 'category',
                value: 'api'
              }
            ]
          }
        ]
    }

    var request = new XMLHttpRequest();    

    request.open("PATCH", "https://westus.api.cognitive.microsoft.com/qnamaker/v4.0/knowledgebases/{kbId}", true);                    
    request.setRequestHeader("Ocp-Apim-Subscription-Key", "{key}");
    request.setRequestHeader("Content-type", "application/json");                    
    request.onreadystatechange = function () { 
        //Call a function when the state changes.
        if (request.readyState == 4) {
            alert(request.responseText);
        }
    }

    request.send(JSON.stringify(jsonData));
}

场景二:查询QnAMaker

对于 POST /generateAnswerOcp-Apim-Subscription-Key 已过时,您必须使用自己的 uri(主机)而不是 westus.api.cognitive.microsoft.com

当 QnAMaker 去年夏天成为 GA 时,header 和主机定义发生了变化。

找到所有参数的正确设置的最简单方法是转到 QnAMaker 门户并单击知识库中的查看代码

从那里你会找到正确的设置来复制它。

下面更改定义的并排比较已发布在 GA announcement