Axios の使い方

最近では JavaScript で通信を行う方法として Fetch API が使用できますが、 ローレベルな API で構成されている Fetch API では満足できず、 高機能なライブラリを使用したいという方もいらっしゃるのではないでしょうか。

Axios とは?

axios_thumb.png

Axios は Promise ベースで作成されたネットワーク通信用のライブラリです。 Fetch API と比べると、Axios はかなり高機能な印象があります。 例えば、リクエストやレスポンスのデータのフォーマットを変換したい場合、 Fetch API ではある程度自分で変換する必要がありましたが、 Axios では与えられたデータや設定内容から自動でフォーマットを変換してくれたりします。 また、Fetch API では、HTTP のステータスコード 4XX や 5XX が成功として扱われてしまい問題となることがありましたが、 Axios ではエラーとして扱ってくれますので、Fetch API よりも違和感のないコードが書けるのではないでしょうか。

Axios のインストール

さっそくですがインストールしていきましょう。

CDN を使用する

script タグで CDN から直接 Axios を読み込んで使用することができます。 CDN は jsDelivr もしくは unpkg が使用できます。 もちろん、このファイルをダウンロードして、自分で配信することもできます。

例:jsDelivr を使用する場合
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
例:unpkg を使用する場合
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

npm を使用する

npm を使用してインストールする場合は、下記のコマンドを実行します。 npm の使い方がわからないという方は、「Node.js と npm の使い方(その1:概要)」を参考にしてください。

npm install axios

npm を使用してインストールした場合は、使用したいファイルで読み込む必要があります。 CommonJS の場合は require()、ES Modules の場合は import を使用して読み込みます。

例:CommonJS の場合
JavaScript
const axios = require('axios');
例:ES Modules の場合
JavaScript
import axios from 'axios';

基本的な使い方

この記事ではリクエスト先の URL を全て「http://example.com/」で記述してありますので、 動作確認をしたい場合は、ご自身の環境に合わせて変更してください。

Axios でリクエストを送信するには axios() を使用します。 axios() の第1引数に JavaScript のオブジェクトを渡すと、リクエストの細かな設定ができます。 レスポンスは Promise で受け取ります。

JavaScript
axios({
	method: 'get',
	url: 'http://example.com/',
})
.then(function (response) {
	console.log(response.data);
});

axios() の第1引数に URL を指定すると、デフォルトで GET リクエストになります。 細かい指定がメンドウな場合は、便利かもしれません。

JavaScript
axios('http://example.com/')
.then(function (response) {
	console.log(response.data);
});

リクエストメソッド専用のメソッドを使用する

GET や POST などのリクエストメソッドには、 それぞれ専用のメソッドがエイリアス(別名)として用意されています。 例えば、GET リクエストの場合は axios.get()、 POST リクエストの場合は axios.post() が使用できます。 詳しい使用方法は後述します。

例:GET リクエストを使用する場合
JavaScript
axios.get('http://example.com/')
.then(function (response) {
	console.log(response.data);
});
例:POST リクエストを使用する場合
JavaScript
axios.post('http://example.com/')
.then(function (response) {
	console.log(response.data);
});

async、await を使う

Axios のレスポンスは Promise なので、asyncawait を使用して記述することもできます。 asyncawait の使い方がわからないという方は、「async、await の使い方」を参考にしてください。

JavaScript
async function http() {
	const response = await axios('http://example.com/');
	console.log(response.data);
}

http();

GET リクエスト

GET リクエストを使用する場合は、 専用のメソッドである axios.get() を使用すると良いでしょう。 第1引数でリクエスト先の URL を指定します。

JavaScript
axios.get('http://example.com/')
.then(function (response) {
	console.log(response.data);
});

GET リクエスト(クエリーパラメーター付き)

URL のクエリーパラメーターは、パラメーターのキーと値が URL エンコードされて =& で繋がれている形式です。 Axios では URL にクエリーパラメーターを自動で付けてくれる機能が搭載されていますので、それを使用すると良いでしょう。 axios.get() の第2引数でリクエストの細かな設定ができます。 クエリーパラメーターを使用するには、params を使用します。

JavaScript
const data = {
	val1: 'hoge',
	val2: 'fuga',
};

axios.get('http://example.com/', {
	params: data,
})
.then(function (response) {
	console.log(response.data);
});
リクエストURL
http://example.com/?val1=hoge&val2=fuga

POST リクエスト

POST リクエストを使用する場合は、 専用のメソッドである axios.post() を使用すると良いでしょう。 第1引数でリクエスト先の URL を、第2引数でリクエストボディに設定したい値を指定します。 また、第3引数でリクエストの細かな設定ができます。

POST リクエスト(テキスト形式)

テキスト形式でリクエストを送信したい場合は、axios.post() の第2引数に送信したいテキストを指定します。

なお、第2引数にテキストを指定した場合、リクエストヘッダーのデフォルトの Content-Typeapplication/x-www-form-urlencoded になります。 text/plain ではないので注意してください。

例:Content-Typetext/html を使用する場合
JavaScript
axios.post('http://example.com/', '<h1>example</h1>', {
	headers: {
		'Content-Type': 'text/html',
	},
})
.then(function (response) {
	console.log(response.data);
});
リクエストヘッダー
Content-Type: text/html
リクエストボディ
<h1>example</h1>

POST リクエスト(JSON 形式)

JSON 形式でリクエストを送信したい場合は、axios.post() の第2引数に JavaScript のオブジェクトを指定します。 第2引数に JavaScript のオブジェクトを指定すると、自動で JSON 形式に変換してくれます。 リクエストヘッダーの Content-Typeapplication/json を設定してくれますし、 リクエストボディも自動で JSON 形式に変換してくれます。

JavaScript
const data = {
	val1: 'hoge',
	val2: 'fuga',
};

axios.post('http://example.com/', data)
.then(function (response) {
	console.log(response.data);
});
リクエストヘッダー
Content-Type: application/json
リクエストボディ
{"val1":"hoge","val2":"fuga"}

HTML のフォーム要素から設定する

送信されるデータを指定するのがメンドウな場合は、HTML のフォーム要素を使用すると良いでしょう。 但し、HTML のフォーム要素の中のファイルは JSON(Base64) 形式には自動で変換されませんので注意してください。 HTML のフォーム要素を使用する場合は、Content-Typeapplication/json を指定する必要があります。

HTML
<form id="testForm">
	<input type="text" name="val1" value="hoge"><br>
	<input type="text" name="val2" value="fuga"><br>
	<input type="file" name="testFile"><br>
	<button type="button">submit</button>
</form>
JavaScript
const formElement = document.querySelector('#testForm');

axios.post('http://example.com/', formElement, {
	headers: {
		'Content-Type': 'application/json',
	},
})
.then(function (response) {
	console.log(response.data);
});

送信されるデータを何か加工したい場合は、 HTML のフォーム要素から FormData オブジェクトに変換してから使用すると便利かもしれません。 この場合も Content-Typeapplication/json を指定する必要があります。

例:HTML のフォーム要素から FormData オブジェクトに変換する場合
JavaScript
const formElement = document.querySelector('#testForm');
const formData = new FormData(formElement);
formData.append('val3', 'piyo');

axios.post('http://example.com/', formData, {
	headers: {
		'Content-Type': 'application/json',
	},
})
.then(function (response) {
	console.log(response.data);
});

POST リクエスト(application/x-www-form-urlencoded 形式)

application/x-www-form-urlencoded は、通常の HTML のフォームの内容を POST で送信する際に使用されている形式です。 リクエストボディの中身は URL のクエリーパラメーターと同じ形式で、 パラメーターのキーと値が URL エンコードされて =& で繋がれている形式の文字列になります。

リクエストヘッダー
Content-Type: application/x-www-form-urlencoded
リクエストボディ
val1=hoge&val2=fuga

この形式を使用する方法は主に2つあります。

方法1:URLSearchParams オブジェクトを使用する

1つ目の方法は、axios.post() の第2引数に URLSearchParams オブジェクトを使用する方法です。 第2引数に URLSearchParams オブジェクトを使用すると、 自動で Content-Typeapplication/x-www-form-urlencoded が設定されます。

JavaScript
const data = {
	val1: 'hoge',
	val2: 'fuga',
};

axios.post('./api200.php', new URLSearchParams(data))
.then(function (response) {
	console.log(response.data);
});

方法2:Content-Type で指定する

2つ目の方法は、axios.post() の第2引数に JavaScript のオブジェクトを指定して、 Content-Typeapplication/x-www-form-urlencoded を指定する方法です。 リクエストボディの変換処理は Axios が自動で行ってくれます。

JavaScript
const data = {
	val1: 'hoge',
	val2: 'fuga',
};

axios.post('http://example.com/', data, {
	headers: {
		'Content-Type': 'application/x-www-form-urlencoded',
	},
})
.then(function (response) {
	console.log(response.data);
});

POST リクエスト(multipart/formdata 形式)

multipart/formdata は、HTML のフォームでファイルを送信する際に使用されている形式です。 この形式はリクエストボディを複数の部分(その名の通りマルチパート)に分割します。 それぞれのパートには別々の項目を格納できるため、ファイルを含めた複数の項目を1度のリクエストでまとめて送ることができます。

リクエストヘッダー
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryTYkANbMgZavU5qqH
リクエストボディ
------WebKitFormBoundaryTYkANbMgZavU5qqH
Content-Disposition: form-data; name="val1"

hoge
------WebKitFormBoundaryTYkANbMgZavU5qqH
Content-Disposition: form-data; name="val2"

fuga
------WebKitFormBoundaryTYkANbMgZavU5qqH--

この形式のリクエストを作成するには axios.post() の第2引数に FormData オブジェクトもしくは HTML のフォーム要素を使用します。 FormData オブジェクトもしくは HTML のフォーム要素を使用すると、 自動で Content-Typemultipart/formdata に設定されます。 パートごとの区切りである boundary も自動で設定されます。

FormData オブジェクトから設定する

送信されるデータを細かく指定したい場合は、FormData オブジェクトを使用すると良いでしょう。

JavaScript
const formData = new FormData();
formData.append('val1', 'hoge');
formData.append('val2', 'fuga');

axios.post('./api200.php', formData)
.then(function (response) {
	console.log(response.data);
});

HTML のフォーム要素から設定する

送信されるデータを指定するのがメンドウな場合は、HTML のフォーム要素を使用すると良いでしょう。

HTML
<form id="testForm">
	<input type="text" name="val1" value="hoge"><br>
	<input type="text" name="val2" value="fuga"><br>
	<input type="file" name="testFile"><br>
	<button type="button">submit</button>
</form>
JavaScript
const formElement = document.querySelector('#testForm');

axios.post('http://example.com/', formElement)
.then(function (response) {
	console.log(response.data);
});

送信されるデータを何か加工したい場合は、 HTML のフォーム要素から FormData オブジェクトに変換してから使用すると便利かもしれません。

例:HTML のフォーム要素から FormData オブジェクトに変換する場合
JavaScript
const formElement = document.querySelector('#testForm');
const formData = new FormData(formElement);
formData.append('val3', 'piyo');

axios.post('http://example.com/', formData)
.then(function (response) {
	console.log(response.data);
});

JavaScript のオブジェクトから設定する

axios.post() の第2引数に JavaScript のオブジェクトを使用したい場合は、 Content-Typemultipart/form-data を指定する必要があります。 Content-Typeboundary は自動で設定されます。 また、リクエストボディの変換処理も Axios が自動で行ってくれます。

JavaScript
const data = {
	val1: 'hoge',
	val2: 'fuga',
};

axios.post('http://example.com/', data, {
	headers: {
		'Content-Type': 'multipart/form-data',
	},
})
.then(function (response) {
	console.log(response.data);
});

axios.postForm() を使用する

axios.post() の代わりに、axios.postForm() を使用する方法もあります。 これは POST で multipart/formdata を送信するための専用のメソッドですが、 PUT を使用する場合は axios.putForm()、 PATCH を使用する場合は axios.patchForm() が使用できます。

第2引数には JavaScript のオブジェクト、FormData オブジェクト、HTML のフォーム要素などを使用することができます。

例:JavaScript のオブジェクトを使用する場合
JavaScript
const data = {
	val1: 'hoge',
	val2: 'fuga',
};

axios.postForm('http://example.com/', data)
.then(function (response) {
	console.log(response.data);
});

レスポンス

ステータスコードとステータスメッセージ

ステータスコードは .status で取得できます。 ステータスメッセージ(リーズンフレーズ)は、.statusText で取得できます。 なお、HTTP/2 にはステータスコードしかなく、ステータスメッセージは無いので注意してください。

JavaScript
axios.get('http://example.com/')
.then(function (response) {
	console.log('response.status: ' + response.status);
	console.log('response.statusText: ' + response.statusText);
});
出力内容
response.status: 200
response.statusText: OK

レスポンスボディ

レスポンスボディの内容は、.data で取得できます。 なお、.data の内容は、デフォルトでは JSON 形式が前提になっており、 自動で JSON パースされて JavaScript のオブジェクトに変換されます。 Content-Type の値が application/json 以外の場合でも JSON パースされますので注意してください。

JSON 形式以外のレスポンスを受け取る

JSON 形式以外のレスポンスを受け取りたい場合は、 リクエスト送信時に responseType で、レスポンスの形式を指定しておく必要があります。

例:テキスト形式で受け取りたい場合
JavaScript
axios.get('http://example.com/', {
	responseType: 'text',
})
.then(function (response) {
	console.log(response.data);
});
例:Blob 形式で受け取りたい場合
JavaScript
axios.get('http://example.com/', {
	responseType: 'blob',
})
.then(function (response) {
	console.log(response.data);
});

参考サイト

関連記事

JavaScript で非同期処理を作成する際に使用するのが async と await です。ですが、この2つをちゃんと理解するのはかなり難しい気がします。そこで、なんとか自分なりにわかりやすくまとめてみます。誰かのお役に立てれば幸いです。Promise の復習async、await を語る前に、まずは Promis ...
JavaScript で通信を行う方法としては以前から XMLHttpRequest がありましたが、あまり使い勝手の良いものではありませんでした。最近では、XMLHttpRequest よりもっと強力で柔軟な操作が可能な API が用意されています。Fetch API とは?Fetch API は Promise ベ ...
最近は jQuery を使用せずに Vue.js を使用されている方も多いのではないでしょうか。そこで Vue.js の使い方についてまとめてみます。誰かのお役に立てば幸いです。Vue.js とは?JavaScript のライブラリと言えば jQuery が有名です。jQuery はローレベルの API で構成されてい ...
JavaScript はもともと大きなプログラムを記述するのにはあまり向いていない言語です。そこで、JavaScript に型による強い制限を加えて、メンテナンス性を向上させようとする試みがあります。動的型付け言語である JavaScript に型による制限を加えるとか、本末転倒じゃないかと思われる方もたくさんいらっし ...
近年の Web 開発では、サーバーサイド(PHP など)ではなく、クライアントサイド(JavaScript)で処理することが多くなりました。JavaScript の重要性が増えるに伴って、そのテストもまた重要になってきます。Jest とは?Jest は、Meta 社(旧:Facebook 社)製の JavaScript ...
JavaScript は文法的にかなりフレキシブルな言語であり、コードが汚くなりがちです。キレイで読みやすいコードを保つために、JavaScript にも静的解析ツールを導入しましょう。ESLint とは?ESLint は、JavaScript の静的解析ツールです。JavaScript コードを実行する前に(つまり静 ...

記事検索

最新記事

人気記事

RSSフィード

お知らせ

フィードバック

要望などあれば、お気軽にどーぞ。 不具合やバグを発見した場合も、連絡をいただけると助かります。

匿名でフィードバックする
匿名でフィードバックする

要望などあれば、お気軽にどーぞ。 不具合やバグを発見した場合も、連絡をいただけると助かります。

なお、このフォームから入力された内容について、管理者から返信はできませんので注意してください。 もし、管理者からの返信が必要であれば、X(Twitter) もしくは、お問い合わせより、お願いします。

  • フィードバックの送信が完了しました。