POST调用在bluemix对​​话框中未经授权

时间:2016-01-11 09:56:13

标签: javascript ajax dialog ibm-cloud ibm-watson

单击按钮时收到此错误响应:

  

" POST https://watson-api-explorer.mybluemix.net/dialog/api/v1/dialogs/c8e08780-b08b-4cdb-8b8c-ea118863fcd1/conversation 401(未经授权)"

这是我的代码:

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>

<body>
    <button onclick="makePostCall()">Click me</button>
    <script>
        makePostCall = function() {
            var username = "c0ae64ef-410a-4f74-b875-ef52dee90686";
            var password = "9K2q4byngzo7";
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'https://watson-api-explorer.mybluemix.net/dialog/api/v1/dialogs/c8e08780-b08b-4cdb-8b8c-ea118863fcd1/conversation', true);
            //xhr.withCredentials = true;
            xhr.setRequestHeader('Access-Control-Allow-Origin', 'http://localhost:80');
            xhr.setRequestHeader('Access-Control-Allow-Credentials', '*');
            xhr.setRequestHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
            xhr.setRequestHeader('Access-Control-Allow-Headers', 'Content-Type', 'application/json', 'Authorization');
            xhr.setRequestHeader('Content-Type', 'application/json');
            xhr.setRequestHeader('Authorization', 'Basic ' + btoa(username + " " + password));
            xhr.send('{"query":{"match_all":{}}}');
        }
    </script>

</body>

</html>

1 个答案:

答案 0 :(得分:0)

首先,您不应该在代码中发布对话服务凭据。既然你有,我建议你删除这项服务并获得一套全新的证书。

第二点,由于浏览器域跨站点限制,您的客户端javascript应该在您自己的服务器中调用代理API。 https://watson-api-explorer.mybluemix.net是swagger文档的入口点,它不是您的应用程序。您可以使用swagger客户端或来自curl等应用程序的swagger API,而不是来自您自己的Web应用程序的基于浏览器的客户端。实际上,这就是swagger应用程序的工作方式,应用程序位于https://watson-api-explorer.mybluemix.net,并且它在https://watson-api-explorer.mybluemix.net上有代理端点

您将需要自己的应用程序入口点作为Dialog服务API的真实URL的代理,其入口点为https://gateway.watsonplatform.net/dialog/api

您正在将对话框ID传递到代理中,因此您必须以某种方式获取它。有两种方法可以做到这一点。通过创建它ala -

curl -u "{username}":"{password}" -X POST  \
        --form file=@template.xml \
        --form name=templateName \
        "https://gateway.watsonplatform.net/dialog/api/v1/dialogs" 

或要求提供对话框列表ala -

 curl -u "{username}":"{password}" "https://gateway.watsonplatform.net/dialog/api/v1/dialogs"

两种方式都要求您提供服务凭据。所以他们应该没事。

对架构进行排序后,对话API就是

curl -u "{username}":"{password}" \
   -X POST
   --form conversation_id={conversation_id}
   --form client_id={client_id}
   --form input="Hi Hello"
   "https://gateway.watsonplatform.net/dialog/api/v1/dialogs/{dialog_id}/conversation"

文档中提供了服务的所有样本卷发调用 - https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/dialog/api/v1/