0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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はオンプレで動かしているサーバーなのに、
なぜか、通信容量制限がある。

image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?