kintone からPOSTリクエストを発行したいのですが、うまくいきません。
ローカルではNodeを利用して開発していたものの、kintone上でNode環境を整える方法がわからなかったためkintone proxyを活用してPOSTしようと考えています。
エラーが起きているのは以下のコードです。
var postData = {
"num": "10"
};
var postDataStr = JSON.stringify(postData);
kintone.proxy(postUrl,'POST',{'Content-Type': 'application/json; charset=UTF-8'},postDataStr,
function(body, status, headers){
console.log(status, body);
resolve(e);
},function(body){
console.log(body);
resolve(e);
});
このとき、エラーは
{"code":"CB_IL02","messageType":"text","success":false,"id":"XXXXX","message":"不正なリクエストです。"}
と表示されています。エラーコードについても検索してみましたが、よくわかりませんでした。
また、NodeからPOSTが成功したときのオプションは以下のようになっています。
var options = {
host: HOST,
port: 3000,
method: "POST",
header: {
'Content-Type': 'application/json',
'Content-Length': postDataStr.length
}
};
よろしくお願いいたします。
こんにちは。
Nodeによるkintoneの開発はやったことが無いのでとても興味深いです。
上手く行きましたらぜひ成果を共有していただけると助かります!
具体的で無くて申し訳ありませんが下記の記事がありましたのでリンクしておきます。
kintoneマッシュアップのための豆知識(curlコマンドとkintone.proxy()の対応)
https://developer.cybozu.io/hc/ja/articles/203446970
教えていただいた記事を読ませてもらいました.proxyの曖昧な理解の隙間を埋められたような気がします.
ただ,いくつか書き方を変えてはみましたがうまくいかず,同じエラーが発生しています.
もし改善すべき部分があれば,教えていただけるとありがたいです.
この辺りでも書かせてもらいましたが、kintone.proxy() からそもそも意図通りにリクエスト出来ているかをチェックすることと、cURLコマンド(今回だとNode.js)等を用いた成功ケースを比べるとデバッグしやすいかと思います。RequestBin が別サイトにて復活しているので、URLをこれに変更してリクエスト比べを行うといいかと思います。
他、気になった点としては、Node.jsによる成功ケースを見るとポート指定されていますが、kintone.proxy() でポート指定ができるかどうかという点ですね(確認したことないです)。リクエスト先の必須仕様だとすると、この辺は確認ポイントのひとつかと思います。ドキュメントにポート番号の指定方法は記載がないので、試すとすると「http://host.com:3000/p/a/t/h」みたくURLの中で指定するのかなぁと想像しますが。
> kintone上でNode環境を整える方法がわからなかった
ちなみに、kintoneに入れることができるのはクライアント用のJavaScriptのみで、基本的にブラウザで動くAPIとkintoneが提供しているJS APIを使って記述することになります。Node.js環境を内包していたり、構築したりといったことはkintoneの機能としては存在しません。
>Ryu Yamashita さん
お返事ありがとうございます。
RequestBinにてデバッグを行おうとしたところ、kintone.proxyを使った接続の場合
{"code":"GAIA_PR01","messageType":"text","success":false,"id":"XXXX","message":"kintoneとプロキシーAPIとの通信でエラーが発生しました。"}
というエラーメッセージが返されました。書き方はいくつか試してみましたがうまくいかなかったため、もしRequestBinでうまくPOSTする方法があれば教えていただけると幸いです。
また、ポート指定についてはご指摘の通り、postUrl内に内包する形で指定しています。
ただ、上手くはいっていません。。。
Node環境は構築できないということに関しては勉強になりました。ありがとうございます。
いくつかの方法を試す中でわかったことがあります。
当初の方法ではURLを「127.0.0.1:3000」のようにIPアドレスとポートのみの指定でPOSTしており、http://を付与していませんでした。
postURLを「http://127.0.0.1:3000」のようにhttp://を付与してみたところ、kintone.proxyによるRequestBinへのアクセスと同様の
{"code":"GAIA_PR01","messageType":"text","success":false,"id":"XXXX","message":"kintoneとプロキシーAPIとの通信でエラーが発生しました。"}
のエラーが発生しました。
この様子だと、kintone.proxyの問題であるか、私のkintone.proxyの書き方に問題があるかの2つに絞られるかな?と考えています。
引き続き、解決策等教えていただけると幸いです。よろしくお願いします。
差し支えなければ、リアルなリクエスト内容をスニペットとして貼ってもらえないでしょうか。実際のリクエスト内容がわからない中でのトラブルシュートは効率が悪いので、(URL中の)ホスト名や認証情報は勿論example.com等で置き換えてもらってという前提です。RequestBinに置き換えたケースも含めて(こちらは実際のスニペットになるかと思います)。
ちなみに、
> kintoneとプロキシーAPIとの通信でエラーが発生しました。
は、仕様から大きく外れたリクエスト内容を行なっていたり、リクエストボディの容量が大き過ぎたりする際に見られるメッセージです。前者の可能性が高いのではないかなぁと想像して先のようにコメントさせてもらいました。
もうひとつ気になるのは、kintone.proxy() がIPアドレスで表現されたURLに対応しているのかという点です(これは試したことないです)。あと、kintone.proxy() は文字通りkintoneで準備されたProxyサーバーを経由させることでJavaScriptからAPIのリクエストを行える仕組みですので、実際に127.0.0.1 を指定されているようなお話であれば、クラウドサイドのProxyサーバーから所望のサーバーへのアクセスはできないことはお分かりだと思います。リクエスト先のAPIのエンドポイントには最低でもグローバルIP、ドメインの付与が必要です。