javascript - Lync UCWA - 创建应用程序给出 HTTP 409 : Conflict error

标签 javascript api rest lync ucwa

过去几天我一直在尝试使用 Microsoft 的 UCWA API(REST API)为工作中的 Lync 服务开发一个应用程序。要使应用程序正常工作:我首先必须使用对特定 URL 的 POST 请求将其提交到 API。首先,我必须向服务器进行身份验证,我通过向 API 发布用户名和密码凭据来完成此操作。然后,我会获取一个访问 token ,通过将 token 发布到每个请求的 header 中,我可以使用该 token 向 API 发出进一步的请求。我已经能够使访问 token 正常工作,但是当我尝试通过向 https://lyncextws.company.com/ucwa/oauth/v1/applications 发布 HTTP 请求来注册应用程序时:事情会开始出错。

所有这一切都是通过一个与 iframe 配合使用的 JavaScript 文件来完成的,以绕过同源策略。

这就是我的代码当前的样子:

<!DOCTYPE html>
<html lang="no">
    <head>
        <meta charset="UTF-8" />
        <title>PresInfoDisp</title>
    </head>
    <body>
        <iframe src="https://lyncextws.company.com/Autodiscover/XFrame/XFrame.html" id="xFrame" style="display: none;"></iframe>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript">

        var access_token;

        var stage = 0;

        // CONNECT AND AUTHENTICATE WITH LYNC UCWA SERVICE
        function connectAndAuthenticate() {

            stage = 1;

            var request = { 
              accepts: 'application/json', 
              type: 'POST', 
              url: 'https://lyncextws.company.com/WebTicket/oauthtoken',
              data: 'grant_type=password&<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4d383e283f232c2028702c2128352c2329283f0d2922202c2423632e22203d2c2334632e2220" rel="noreferrer noopener nofollow">[email protected]</a>&password=somePassword'
            }; 
            document.getElementById('xFrame').contentWindow.postMessage(JSON.stringify(request), 'https://lyncextws.company.com/WebTicket/oauthtoken');
        }

        // REQUEST A USER RESOURCE
        function getUserResourceAuthRequest() {

            stage = 0;

            var request = { 
              accepts: 'application/json', 
              type: 'GET', 
              url: 'https://lyncextws.company.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=company.com'
            }; 
            document.getElementById('xFrame').contentWindow.postMessage(JSON.stringify(request), 'https://lyncextws.company.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=company.com');

        }

        function getUserResource() {

            stage = 2;

            var request = { 
              accepts: 'application/json', 
              type: 'GET', 
              url: 'https://lyncextws.company.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=company.com',
              headers: {Authorization: "Bearer "+access_token}
            }; 
            document.getElementById('xFrame').contentWindow.postMessage(JSON.stringify(request), 'https://lyncextws.company.com/Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=company.com');

        }

        // REGISTER APPLICATION RESOURCE
        function registerApplication() {

            stage = 3;

            var request = { 
              accepts: 'application/json', 
              type: 'POST', 
              url: 'https://lyncextws.company.com/ucwa/oauth/v1/applications',
              headers: {Authorization: "Bearer "+access_token},
              data: {'userAgent': 'InfoDisp1',  'endpointId' : '2d9dc28d-4673-4035-825c-feb64be28e4e', 'culture': 'en-US'}
            }; 
            document.getElementById('xFrame').contentWindow.postMessage(JSON.stringify(request), 'https://lyncextws.company.com/ucwa/oauth/v1/applications');

        }

        // GRAB A LIST OF CONTACTS
        function listContacts() {

            stage = 4;

            var request = { 
              accepts: 'application/json', 
              type: 'GET', 
              url: 'https://lyncextws.company.com/ucwa/oauth/v1/applications',
              headers: {Authorization: "Bearer "+access_token}
            }; 
            document.getElementById('xFrame').contentWindow.postMessage(JSON.stringify(request), 'https://lyncextws.company.com/ucwa/v1/applications');

        }

        this.receiveMessage = function(message) { 

            switch(stage) {
                case 1:

                    var beforeReplace = message.data.replace("/\\/g", "");
                    var json = jQuery.parseJSON(beforeReplace);
                    var json2 = jQuery.parseJSON(json.responseText);
                    access_token = json2.access_token;
                    console.log(json2.access_token);
                    console.log(message);

                    getUserResource();

                    break;
                case 0:
                    console.log(message);

                    connectAndAuthenticate();

                    break;

                case 2:

                    var beforeReplace = message.data.replace("/\\/g", "");
                    var json = jQuery.parseJSON(beforeReplace);
                    var json2 = jQuery.parseJSON(json.responseText);
                    console.log(json2._links.applications.href);

                    window.setTimeout(function(){registerApplication()}, 5000);

                    break;
                case 3:

                    console.log(message);

                    break;
                case 4:



                break;
            }


        }; 
        window.addEventListener('message', this.receiveMessage, false);


        $(window).load(function() {
            getUserResourceAuthRequest();
            //console.log(access_token);
        });

        </script>
    </body>
</html>

当我运行此代码时:最后一个ajax查询返回错误409:冲突,而它应该返回201:创建

这是我的浏览器(Google Chrome)的输出: What my browser outputs in the developer console in Google Chrome

401:未经授权的错误应该发生,但 409 冲突不应该发生。所以这是我的问题: 任何人都可以找出为什么我收到此 409 错误而不是我应该收到的 201 错误吗?

来自 Microsoft 的示例代码似乎运行良好,但我想避免使用它,因为它需要我很长时间才能熟悉它。

如果缺少数据,您需要找出问题:在评论中告诉我,我会提供!

最佳答案

如果更换

data: {'userAgent': 'InfoDisp1',  'endpointId' : '2d9dc28d-4673-4035-825c-feb64be28e4e', 'culture': 'en-US'} 

用该数据的字符串代替 I.E.

data: "{'userAgent': 'InfoDisp1',  'endpointId' : '2d9dc28d-4673-4035-825c-feb64be28e4e', 'culture': 'en-US'}" 

似乎数据需要一个字符串,在您的示例中,您向其传递一个 JSON 对象。这样做会让你的例子对我有用。

关于javascript - Lync UCWA - 创建应用程序给出 HTTP 409 : Conflict error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26174152/

相关文章:

javascript - 在没有 css 剪辑路径的情况下设计 iframe 的包装器 div

javascript - 标题必须有内容,并且内容必须可由屏幕阅读器访问

php - 如何为具有 "name"和 "date"的行生成唯一 ID,以避免重复条目?

javascript - 相对div内的动态定位

javascript - 如何显示 ng Repeat 内包含多个点的字符串的最后部分?

iphone - iPhone-文本语音转换API功能

java - 请求之间的 JAX-RS REST API 变量共享

java - Neo4j REST API Java 绑定(bind) 唯一性已弃用

javascript - Firebase 与 Web : Using user Id in reference causes error: Uncaught TypeError: Cannot read property 'on' of undefined

angularjs - Angular $scope 数据不会更新