プリザンターのAPI連携を試してみた!

こんにちは。IISの田口です。

プリザンターAPIJavascriptで様々な外部システムと連携できる拡張性の高さも特徴の一つです。
そこで、私もAPI連携について試してみました。
APIの記事としては先に公開されている方々もいらっしゃいますので、私がつまずいた箇所にポイントを絞って紹介します。

ポイントはContentTypeの設定です

まずはC#で試してみました。
結果としてContentTypeを以下のように

"application/application/x-www-form-urlencoded"

と設定することでレコードが取得出来ました。
JSONファイルだから"application/json"でOKかと思ったらダメでした。

private async Task<string> ApiTest()
{
    string uri = "http://localhost/pleasanter/api_items/99/get";
    Dictionary<string, string> param = new Dictionary<string, string>()
    {
        ["ApiKey"] = "取得したAPIキー"
    };

    using (HttpClient httpClient = new HttpClient())
    {
        var json = new JavaScriptSerializer().Serialize(param);
        var content = new StringContent(json, Encoding.UTF8, "application/x-www-form-urlencoded");  // ←これで取得出来る。
        // var content = new StringContent(json, Encoding.UTF8);                                       ←これだと取得出来ない
        // var content = new StringContent(json, Encoding.UTF8, "application/json");                   ←これでも取得出来ない

        var response = await httpClient.PostAsync(uri, content);
        var result = await response.Content.ReadAsStringAsync();
        return result;
    }
}

次にJavascriptでも試してみました。 JavascriptではContentTypeを設定しないことでレコードが取得出来ました。
※むしろ何か設定すると取得出来ませんでした。

$(function(){
  var uri = "http://localhost/pleasanter/api_items/99/get";
  var json = {
    "ApiKey": "取得したAPIキー"
  };

  // contentTypeは設定しない
  $.ajax({
    type: "post", 
    url: uri, 
    data: JSON.stringify(json),
    dataType: "json"
  })
  .done(function(data){
    alert("成功");
    alert(JSON.stringify(data));
  })
  .fail(function(){
    alert("失敗");
  })
  .always(function(){
    alert("完了");
  });
});

Javascriptでのその他の注意点として、開発サーバなど自己署名証明書(いわゆるオレオレ証明書)によるhttps通信だと$.ajaxがエラーになります。

感想

Javascriptの処理はプリザンターで2つのプルダウンの連携(プルダウンAの選択内容に応じてプルダウンBの中身を動的に変更する)などに活用できます。

最後に

ポイントであるContentTypeの設定内容については@hatayan1126さんの記事がヒントになりました。ありがとうございました。