FileMarkerのデータをTypeScriptで扱う
FileMarkerで作られたシステムがあり、その中のデータを使ったちょっとした別画面が欲しいが
FileMarkerを扱える人が既におらず、TypeScriptで開発することになった。
FileMarkerサーバーからデータを取得するのに
FileMaker Data API
なるものがあるので、これで扱える。
なんらなライブラリがある。
取り扱い注意
それでもいくつか注意点
ライブラリの説明にも書いてあるけど
日付がMM/dd/yyyyの文字列になっているのでDateで扱う場合は、変換しないといけない
さらに画像を張り付けていたりすると
オブジェクトフィールドデータの場合、FileMaker Data API はオブジェクトデータのオブジェクトへのパス参照を含む URL を返します。
とのことで、URLが乗っている
こんなの
https://192.168.1.2/Streaming/Additional_1/3B321F4E7FB47F7BF6A1BC583B321F829DFE36A23DFE36A16F12A7DD2F9AD9FE.jpg?RCType=EmbeddedRCFileProcessor
このURLで直接取得ではなく、302でリダイレクトされる。
しかし、axios.get()やfetch()だと上手く取得でない。
理由は
302レスポンスとともにSet-Cookieが来ていて、
リダイレクト先にCookieを送らないといけないが
その動作に対応していない。
こんな風に雑対処したんだけど、
const ret = await axios.get(imageURL,{"maxRedirects":0,"params":prams,"responseType":"arraybuffer"});
if(ret.response.status === 302){
const cookie = ret.response.headers['set-cookie'];
const loc = new URL(`${imageURL.origin}${ret.response.headers['location']}`);
let prams = {};
for(const [key,val] of imageURL.searchParams.entries()){
prams = Object.assign(prams,{[key]:val});
}
if(cookie && loc){
return await axios.get(`${loc.origin}${loc.pathname}`,{"maxRedirects":0,"headers":{"Cookie":cookie.split(';')[0]},"params":prams,"responseType":"arraybuffer"});
}
}
改めて調べたら、もっと簡単に出来る模様
余談
現在はそのFileMarkerで作られたシステムをリプレースすることになっている。
FileMaker Data APIを扱う機会は多分もうない。
余談2
FileMaker Data APIはオンプレで動かしているサーバーなのに、
なぜか、通信容量制限がある。