我已经在服务器端获得了一个令牌并将其存储在一个 cookie 中,但是当我使用该令牌查询 api 时,我似乎无法弄清楚为什么会出现错误。
这是我发送的 jQuery ajax 请求:
$.ajax({
url:'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone',
data:{
'X-Watson-Authorization-Token':readCookie('token'),
'text':input,
'version':'v3',
'version_date':'2016-05-19'
},
dataType:'jsonp',
contentType:'application/json',
method:'GET',
success:function(tone){
console.log(tone);
}
});
如果我不使用dataType:jsonp
,我会收到 no access control-origin 错误。当我不使用contentType:application/json
或使用contentType:application/javascript
时,当查询 api 并询问用户名和密码时,我会得到一个登录对话框。但是既然我有一个令牌,我就不应该传递用户名和密码。当我以这种方式运行它时,同时使用 dataType 和 contentType,我收到 400 错误错误请求。
有谁知道我做错了什么?文档说我可以在客户端使用令牌。但我必须在服务器端获取它。
更新:
根据建议,我没有通过单独的 php 文件的 jquery ajax 调用访问服务器端代码。我能够获得令牌,但是当我将它传递给音调分析器的 api 调用时,我收到 400 错误。无论我是否对令牌进行 decodeURI 。
这是我的jQuery:
$.when($.ajax({
url:'watsonToken.php',
type:'GET',
})).done(function(token){
console.log('watsonToken, lasts 1 hour: ', decodeURI(token));
$.ajax({
url:'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone',
type:'POST',
data:JSON.stringify({
'body':input,
'version':'2016-05-19'
}),
contentType:'application/json',
headers:{
'X-Watson-Authorization-Token':decodeURI(token)
},
success:function(tone){
console.log(tone);
},
error: function(error){
console.error('Error: Couldn\'t use token: ', error);
}
});
}).fail(function(){
console.error('Error: Couldn\'t fetch watson token');
});
以及获取令牌的 watsonToken.php 文件:
<?php
$accessWatsonToken = curl_init();
$params=http_build_query(array('url' => 'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone'));
curl_setopt($accessWatsonToken, CURLOPT_URL, "https://gateway.watsonplatform.net/authorization/api/v1/token?$params");
curl_setopt($accessWatsonToken, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($accessWatsonToken, CURLOPT_USERPWD, 'username':password');
print curl_exec($accessWatsonToken);
curl_close($accessWatsonToken);
?>