この記事はLINEWORKS Advent Calendar 2021の16日目となります。
はじめに
request という npm のパッケージが非推奨となっており、新しいパッケージに移行するため axios を導入しました。
意外とaxiosを使っての記事が少なかった?っぽいので書きました。
合わせて簡単にですが request からの書き換えについても触れます。
メッセージの送信
コードはこんな感じになります
send.js
const body = {
accountId: 'アカウントID',
content: {
type: 'text',
text: 'メッセージ'
}
};
const options = {
url: 'https://apis.worksmobile.com/r/{API ID}/message/v1/bot/{botNo}/message/push',
method: 'POST',
headers: {
consumerKey: consumerKey,
Authorization: authorization,
'Content-type': 'application/json'
},
body: JSON.stringify(body)
};
axios
.request(options)
.then((res) => {
if (response.status < 200 || response.status >= 300) {
throw res.data;
} else {
console.log('success');
console.log(res.data);
}
})
.catch((e) => {
console.log('failed');
console.log(e);
});
大まかな request からの変更点は以下になると思います。
- リクエストボディのキーが body から data に
- コールバックから Promise に
- レスポンスの引数が一つに
コンテンツのアップロード
send.js
const FormData = require('form-data');
const fs = require('fs-extra');
formData.append('resourceName', fs.readFileSync(filePath), {
filename: filename,
contentType: contentType
};
const options = {
url: 'https://storage.worksmobile.com/openapi/message/upload.api',
method: 'POST',
headers: {
consumerKey: consumerKey,
Authorization: authorization,
'x-works-apiid': apiId,
...formData.getHeaders()
},
data: formData.getBuffer()
};
axios
.request(options)
.then((res) => {
if (response.status < 200 || response.status >= 300) {
throw res.data;
} else {
console.log('success');
console.log(res.data, res['x-works-resources-id']);
}
})
.catch((e) => {
console.log('failed');
console.log(e);
});
request の場合では、options のキーを formData とすることで form-data 形式が使えましたが、axios だとその機能はないため、form-data を使うのが無難です。
また、ヘッダーも良い感じに処理はしてくれないので、自分で getHeaders() をしてヘッダーを追加する必要もあります。
またファイルを buffer ではなく stream で処理する場合は、LINEWORKS ではそのままだと StreamLength を正しく認識してくれないので、Content-Lengthを正しく設定してあげる必要があると思います。