Published on

Node.js + axios で XMLのリクエストとレスポンスを簡単にする

はじめに

リリースから随分経っているサービスののAPIを叩くときにXMLのときがありますよね?
最近の主流はjsonなので、使ったことなかったり解析するのが大変ってことありませんか?
axiosにある工夫をすればリクエストとレスポンスを自動でjsonっぽくしてくれます。

環境

  • node 14.17.0
  • axios 0.24.0
  • fast-xml-parser 4.0.3

本題

まず、axiosとfast-xml-parserをそれぞれインストール

npm i axios fast-xml-parser

次に、各モジュールのセットアップ
各それぞれの処理の説明は、コメントに記載

import axios from 'axios';
import { XMLParser, XMLBuilder } from 'fast-xml-parser';
const parser = new XMLParser({
ignoreAttributes: false, // attributeが自動で削除される設定になっているのでオフに
numberParseOptions: { // 数字の場合、0が消えてしまうので設定追加
leadingZeros: false,
hex: false,
},
});
const builder = new XMLBuilder({
ignoreAttributes: false, // attributeが自動で削除される設定になっているのでオフに
format: true, // きれいにフォーマット
});
this.axios = axios.create({
baseURL: 'https://exmaple.com', // ベースになるURL
responseType: 'document',
headers: { 'Content-Type': 'text/xml' }, // リクエストがXMLだと示す
transformRequest: [ // リクエスト前に処理を挟む
(data) => {
const xml = builder.build(data); // axiosにデータとして渡したものをXMLに変換
return xml.toString();
},
],
transformResponse: [ // レスポンス後に処理を挟む
(data) => {
const obj = parser.parse(data); // レスポンスをオブジェクトに変換
return obj;
},
],
});

まとめ

今回のいちばん重要な部分は、transformRequesttransformResponseでそれぞれリクエストとレスポンスの間に処理を挟むことができる。
この部分を改造すれば、たとえXMLでなくても同じ感じに処理できる。 参考までに〜