0

すでにサーバー側にトークンを取得してクッキーに保存していますが、そのトークンでAPIにクエリを実行するとエラーが発生します。私はdataType:jsonpを使用しない場合iBMを使用している場合のクライアント側のエラーサーバー側でBluemixトーンアナライザトークンを取得しました

$.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); 
     } 
    }); 

が、私はノーアクセスコントロール由来のエラーを取得:

は、ここで私が送信していjQueryのAjaxのリクエストです。 contentType:application/jsonを使用しないか、contentType:application/javascriptを使用すると、ユーザー名とパスワードの入力を要求されたときにログインダイアログが表示されます。しかし、私はトークンを持っているので、ユーザー名とパスワードを渡す必要はありません。そして、私がdataTypeとcontentTypeの両方でこの方法で実行すると、400エラーが発生します。

誰かが私が間違っていることを知っていますか?ドキュメントでは、クライアント側でトークンを使用できると言いますが、サーバー側でトークンを取得する必要があります。

UPDATE:アドバイスを1として

、私は別のPHPファイルのjqueryのAJAX呼び出しを介してサーバー側のコードにアクセスしていません。私はトークンを取得することができますが、それをトーンアナライザのAPIコールに渡すと400エラーが発生します。私がトークンをデコードするかどうかにかかわらず。ここで

は私の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); 
?> 

答えて

1

私はそれがあるべきときに身体のparamとしてX-Watson-Authorization-Tokenを入れしようとしていると思いますヘッダーとversionは照会パラメーターでなければなりません。また、JQueryの残りの呼び出しのデータフィールドには、すでに文字列化されているオブジェクトを文字列に変換しています。デコードする必要がないトークンレスポンスをデコードするヘッダにあります。

詳細については、 Watsonトーンアナライザサービスへの呼び出しhere

EDIT:PHPを使用した完全な例です。

のindex.php

<!doctype html> 
<html lang="en"> 
<head> 
    <title>Watson Tone Analyzer Example</title> 
    <meta charset="utf-8"/> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 
</head> 

<body> 
    <h2>This is an example of client side call to Watson Tone analyzer service using an authorization token.</h2> 
    <div id="myoutput"></div> 
</body> 
</html> 

<script> 
analyze(); 

function analyze(){ 
    $.ajax({ 
     url:'/get-token.php', 
      type:'GET', 
      success:function(token){ 
       callToneAnalyzer(token); 
      }, 
      error: function(err) { 
       console.error(err); 
      } 
     }); 
} 

function callToneAnalyzer(token) { 
    $.ajax({ 
     url:'https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone?version=2016-05-19', 
      type:'POST', 
      data: JSON.stringify({text: "this is my sample text"}), 
      contentType: 'application/json', 
      headers: { 
      'X-Watson-Authorization-Token': token 
      }, 
      success:function(tone){ 
       $("#myoutput").text(JSON.stringify(tone)); 
      }, 
      error: function(err) { 
       $("#myoutput").text(JSON.stringify(err)); 
      } 
     }); 
} 
</script> 

取得-token.php

<?php 
// Send a http request using curl 
function getToken(){ 
    $username='YOUR-TONE-ANALYZER-USERNAME'; 
    $password='YOUR-TONE-ANALYZER-PASSWORD'; 
    $URL='https://gateway.watsonplatform.net/authorization/api/v1/token?url=https://gateway.watsonplatform.net/tone-analyzer/api'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $URL); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds 
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 

    $result=curl_exec ($ch); 
    curl_close ($ch); 
    return $result; 
} 
echo getToken(); 
?> 
+0

ああ、私はそれはあなたがヘッダを渡す方法です知りませんでした。しかし今、私は403エラーが発生します: 'MLHttpRequestはhttps://gateway.watsonplatform.net/tone-analyzer/api/v3/toneを読み込めません。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーが存在しません。したがって、Origin 'https:// domaincom'はアクセスできません。応答はHTTPステータスコード403でした。 ' – wordSmith

+0

あなたはlocalhostなどから実行していますか?トークンの使用を除いて、上記のコードの正確なコピーを試しましたか? –

+0

私はこの正確なコードを使用して、これを実際のサーバー上でオンラインで実行しています。 – wordSmith

関連する問題