【发布时间】:2014-10-03 06:20:51
【问题描述】:
过去几天我一直在尝试使用 Microsoft 的 UCWA API(REST API)为我们的 Lync 服务开发应用程序。要使应用程序正常工作:我首先必须使用对某个 URL 的 POST 请求将其提交给 API。首先,我必须通过服务器进行身份验证,我通过向 API 发布用户名和密码凭据来做到这一点。然后我得到一个访问令牌,我可以通过在每个请求的标头中发布令牌来使用它来向 API 发出进一步的请求。我已经能够让访问令牌正常工作,但是当我尝试通过向 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&username=alexander@domain.company.com&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) 输出的内容:
401: Unauthorized 错误应该发生,但 409 冲突不应该发生。所以这是我的问题: 谁能发现为什么我得到这个 409 错误而不是我应该得到的 201?
Microsoft 的示例代码似乎运行良好,但我想避免使用它,因为我需要很长时间才能熟悉它。
如果缺少数据,您需要发现问题:在 cmets 中告诉我,我会提供!
【问题讨论】:
-
endpointId总是那个静态字符串吗? -
@user1680977 是的。如果我从某个地方获得它?它会在哪里?
-
对于应用程序的 POST,您的请求标头/正文是什么样的?响应头/正文是什么样的?
标签: javascript api rest lync ucwa