Blog

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

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

2022/03/10
#axios #javascript

はじめに

リリースから随分経っているサービスのの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でなくても同じ感じに処理できる。 参考までに〜