kintone.proxy POSTがうまくいきません

satoと申します。連投になってもうしわけありません。
kintone.proxyのPOSTがうまくいきません。
応急処置としてjQueryでしのいでいます。
たとえば、これはあるAPIのログイン時です。

//kintone proxy POST
var token;
var header = {“Content-Type”: “application/json”};
var query = {“f”:“json”, “username”:myname, “password”:mypassword, “referer”:“http://somewhere.com”};
var url = ‘https://www.somewhere.com/generateToken’;
kintone.proxy(url, ‘POST’, header, query, function(body, status, headers) {
//success
console.log(status);
console.log(body);
token = body.token;
if (typeof(token) === ‘undefined’){
alert(‘ログインに失敗しました。usernameかpasswordが間違っています。’);
}else{
alert(‘ログインに成功しました。’)
}
}, function(error) {
//error
console.log(error);
alert(‘ログインに失敗しました。’);
token = null;
});

実行結果は ‘ログインに失敗しました。usernameかpasswordが間違っています。’
status = 200 で通信自体は成功していますが、帰ってきた body が HTML形式 で、“f”:“json” で指定したJSONと違っていて、うまくパースできてません。

一方、うまく動作しているjQueryは以下のとおりです。

//jQuery
$.ajax({
url: ‘https://www.somewhere.com/generateToken’,
type: ‘POST’,
dataType: ‘json’,
data: {‘f’:‘json’, ‘username’:myname, ‘password’:mypassword, ‘referer’:‘http://somewhere.com’},
timeout: 10000,
}).done(function(resp){
console.log(resp);
token = resp.token;
if (typeof(token) === ‘undefined’){
alert(‘ログインに失敗しました。usernameかpasswordが間違っています。’);
}else{
alert(‘ログインに成功しました。’)
}
}).fail(function(resp){
console.log(resp);
alert(‘ログインに失敗しました。’);
token = null;
});

jQueryだと、kintoneのアップデート時に動作が保証されないと聞きました。
できれば、kintone.proxyに直したいのですが、どうすればよろしいでしょうか。

※myname,mypasswordは、その都度入力いたします。

Yoshihiro Sato さん

問題を切り分けるための情報が必要です。
console.log(body); の表示は、どのような内容になっていますか?
文字列で正常な応答が返ってきているならば、パースが必要です。

var resp = JSON.parse(body);
token = resp.token;

Yoshihiro Satoさん
cstapの瀧ヶ平です。

kintone.proxyで返ってきているbodyがHTML形式というのは、ResponseHeaderのContent-Typeがtext/htmlになっているということですか?それとも、実際にHTMLの形式のデータ(HTMLタグで構成されているデータ)が返されているということですか?

もし、返ってきているbodyのデータが、JSONに準拠した文字列であれば、var response = JSON.parse(body); を実行すればresponseにJSONオブジェクトを代入できます。そうでない場合、正しくパラメータが送られていないか、相手側のAPIの問題かと思います。

参考になりますでしょうか

 

どうもレスありがとうございます。

console.log(body)ではHTMLタグで構成された文字列が表示されます。コピペしてブラウザで表示すると、この外部APIのリファレンスのページへのリンクが表示されます。

APIのリファレンスには、フォーマットを指定するパラメータ f には html と json が指定でき、デフォルトは html だそうです。

ちなみに返ってきたヘッダは以下の通りでした。

  1. Connection:“keep-alive”
  2. Content-Length:“535”
  3. Content-Type:“text/html;charset=utf-8”
  4. Date:“Fri, 07 Apr 2017 08:56:04 GMT”
  5. Vary:“Accept-Encoding, User-Agent”
  6. X-Frame-Options:“SAMEORIGIN”
  7. X-XSS-Protection:“1; mode=block”

 

Yoshihiro Satoさん

jQueryの方ではcontentTypeオプションを指定していないのでおそらくパラメータが x-www-formurlencoded つまりURL末尾に ?key1=value1&key2=value2 のような形のパラメータを付与して送信していると思います。

相手のAPIの仕様が分からないので推測ですが、kintone.proxyでパラメータを送信する際にこの形式で送信してみてはどうでしょうか

url = ‘https://www.somewhere.com/generateToken’? + “f=json&username=” + username + “&password=” + password + “&referer=http://somewhere.com” ;

のようにして、queryの部分には空のオブジェクトにして実行してみた場合はどうなりますか?

瀧ヶ平さん

教えていただいた方法でうまくいきました。ありがとうございました。

ヘッダの指定など基本的なところがまだまだなので、これから勉強します。