【问题标题】:How to consume the REST API of QnA Maker to update my Knowledge Base using native JavaScript?如何使用 QnA Maker 的 REST API 来使用原生 JavaScript 更新我的知识库?
【发布时间】:2019-04-06 01:52:28
【问题描述】:

我正在尝试使用 Azure REST API 来更新我通过 QnA Maker 创建的知识库。那里有一个链接可以转到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 测试控制台,但不适用于上面的代码。知道我在这里缺少什么吗?

谢谢!

在 Github 上上传的工作解决方案Solution

【问题讨论】:

  • 你的 uri 是错误的并且标题“Ocp-Apim-Subscription-Key”到
  • @FrV,你能提供正确的 uri 和标题吗?你能提供一个例子吗?谢谢!

标签: qnamaker


【解决方案1】:

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

场景 1:创建 QnAMaker 对

要创建 QnAMaker 对有点困难,我建议从 C# Sample 及其 Program.cs 开始。从那里您可以将其转换为 java 脚本。该文档也有其他语言的示例,例如对于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));
}

场景 2:查询 QnAMaker

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

去年 QnAMaker 成为 GA Summer 时,标头和主机定义发生了变化。

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

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

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

【讨论】:

  • 我尝试进行以下更改:` request.open("POST", "{HOST_URL}", true); request.setRequestHeader("POST", "{POST_VALUE}"); request.setRequestHeader("主机", "{HOST_VALUE}"); request.setRequestHeader("授权", "AUTH_VALUE"); ` ...但我收到以下错误:`拒绝设置不安全的标头“主机”`
  • 嗨@ericute。主机不是标题。它是 URL https://{host}/knowledgebases/xxx 的一部分。好吗?
  • @ericute 更新了我的答案,使这部分更加清晰。如果您仍有问题,请分享您的完整代码库,我会看看。
  • 所以我对其进行了更多编辑。 ``` request.open("POST", "qnawcfaq.azurewebsites.net/qnamaker", true); request.setRequestHeader("POST", "qnawcfaq.azurewebsites.net/qnamaker/knowledgebases{kbId}/generateAnswer"); request.setRequestHeader("授权", "EndpointKey {KEY}"); ``` 我收到了这个错误:``` 405 (Method Not Allowed) ``` 感谢你的帮助,伙计。
  • 我认为你在这里误解了一些东西:你必须request.Open("POST", "https://qnawcfaq.azurewebsites.net/qnamaker/knowledgebases/{kbId}/generateAnswer")。您需要设置的唯一标题(除了内容类型)是("Authorization", "EndpointKey {KEY}"),就像您所做的那样。删除其余部分。
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多