当サイトは、アフィリエイト広告を利用しています
javascriptの非同期通信処理のXMLHttpRequestを
使う方法について試して見たので忘備録として残す。
※Reactでの実装サンプルもあります。
またjavascriptの非同期通信処理はいつくも種類があるため整理する。
javascriptの非同期通信処理を行う方法は大きく三つある。
基本的にできることは同じだが、実装方法や対応ブラウザが異なる。
XMLHttpRequestオブジェクトを使ってブラウザと
WEBサーバ間でデータの送受信を行うことができる。
※Promiseと組み合わせることもできる
Promiseを使ってブラウザと
WEBサーバ間でデータの送受信を行うことができるモダンブラウザの標準機能
※HTTP通信の方法がXMLHttpRequestではない。
詳しくは下記記事でまとめています
非同期通信処理でXMLHttpRequest + Promiseの処理をより簡単に扱えるようにしたライブラリ。
※戻り値はPromise
詳しくは下記記事でまとめています
ここではXMLHttpRequestのサンプル実装をしてみる。
XMLHttpRequestオブジェクトを使い、GETでデータを取得する
const sampleFunc = () => {// オブジェクト生成let xmlHttpRequest = new XMLHttpRequest();// responseTypeを設定(結果の型を指定)xmlHttpRequest.responseType = "json";// onreadystatechangeイベントでリクエストの状況を監視xmlHttpRequest.onreadystatechange = function () {if (this.readyState === 4 && this.status === 200) {console.log(JSON.stringify(this.response,null,3));}};// アクセス方法とパスを設定// 通信方法// パス// true:非同期、false:同期xmlHttpRequest.open("GET","https://jsonplaceholder.typicode.com/todos/1",true);// 通信実行xmlHttpRequest.send();};sampleFunc()// 結果// {// "userId": 1,// "id": 1,// "title": "delectus aut autem",// "completed": false// }
XMLHttpRequestオブジェクトを使い、POSTでデータを送信し、 登録結果を取得する
const sampleFunc = () => {// オブジェクト生成let xmlHttpRequest = new XMLHttpRequest();// responseTypeを設定(受け取る型)xmlHttpRequest.responseType = "json";// onreadystatechangeイベントでリクエストの状況を監視xmlHttpRequest.onreadystatechange = function () {if (this.readyState === 4 && this.status === 201) {console.log(JSON.stringify(this.response,null,3));}};// アクセス方法とパスを設定// アクセス方法// パス// true:非同期、false:同期xmlHttpRequest.open("POST","https://jsonplaceholder.typicode.com/todos",true);// サーバに対して解析方法を指定するxmlHttpRequest.setRequestHeader("Content-Type","application/json; charset=UTF-8");// 送るデータconst sendData ={"userId": 1,"id": 1,"title": "delectus aut autem","completed": false}// 通信実行xmlHttpRequest.send(JSON.stringify(sendData));};sampleFunc();// 結果// {// "userId": 1,// "id": 201,// "title": "delectus aut autem",// "completed": false// }
xmlHttpRequest.openをPOSTにする
xmlHttpRequest.setRequestHeaderで送るデータの型を指定する
※指定しない通信できない
xmlHttpRequest.sendでdataを送る
※xmlHttpRequest.setRequestHeaderで指定した型以外のデータ型だと失敗する
onreadystatechangeで監視しているが、下記で監視することもできる
xmlHttpRequest通信結果をPromiseで受け取ることもできる
// Promiseconst promiseFunc = () => {// 戻り値をPromiseで取得するreturn new Promise((resolve, reject) => {// オブジェクト生成let xmlHttpRequest = new XMLHttpRequest();// responseTypeを設定(受け取る型)xmlHttpRequest.responseType = "json";// onloadイベントでリクエストの状況を監視xmlHttpRequest.onload = (e) => {if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 201) {resolve(xmlHttpRequest.response);} else {reject(xmlHttpRequest.status);}};// アクセス方法とパスを設定// アクセス方法// パス// true:非同期、false:同期xmlHttpRequest.open("POST","https://jsonplaceholder.typicode.com/toos",true);// サーバに対して解析方法を指定するxmlHttpRequest.setRequestHeader("Content-Type","application/json; charset=UTF-8");// 送るデータconst sendData = {userId: 1,id: 1,title: "delectus aut autem",completed: false};// 通信実行xmlHttpRequest.send(JSON.stringify(sendData));});};// 実行promiseFunc()//通信成功時の処理.then((data) => console.log(JSON.stringify(data, null, 3)))// 通信失敗時の処理.catch((data) => console.log(JSON.stringify(data, null, 3)));// 実行結果// 成功// {// "userId": 1,// "id": 201,// "title": "delectus aut autem",// "completed": false// }// 失敗// 404
xmlHttpRequest + Promiseを使って
reactでデータ取得処理を実装してみる
/** @jsxImportSource @emotion/react */import { css } from "@emotion/react";import React, { useState } from "react";export default function App() {const [post, setPosts] = useState([]);// コールバッグ関数const result = () => {// 非同期処理を呼び出すreturn (getData()// 正常.then((data) => setPosts(() => data))// 異常.catch((message) => console.log(message)));};return (<div><h2>データ</h2><button type="button" onClick={() => result()}>データ取得</button><div>{post &&post.map(({ userId, id, title }) => (<div css={Container} key={title}><div css={item}>{userId}</div><div css={item}>{title}</div></div>))}</div></div>);}// 登録データ取得(Promise)const getData = () => {// 戻り値をPromiseで取得するreturn new Promise((resolve, reject) => {// オブジェクト生成let xmlHttpRequest = new XMLHttpRequest();// responseTypeを設定(受け取る型)xmlHttpRequest.responseType = "json";// onloadイベントでリクエストの状況を監視xmlHttpRequest.onload = (e) => {let resultData;if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 201) {console.log(xmlHttpRequest.response);resultData = xmlHttpRequest.response;// オブジェクトを表示用にListに変換if ("object" === typeof xmlHttpRequest.response) {resultData = Object.values(xmlHttpRequest.response).filter((prop) => typeof prop === "object");}resolve(resultData);} else {reject("error");}};// アクセス方法とパスを設定// アクセス方法// パス// true:非同期、false:同期xmlHttpRequest.open("POST","https://jsonplaceholder.typicode.com/posts",true);// サーバに対して解析方法を指定するxmlHttpRequest.setRequestHeader("Content-Type","application/json; charset=UTF-8");// 送るデータconst data = [{title: "a1 test",body: "this is test by a1",userId: 1},{title: "a2 test",body: "this is test by a2",userId: 2}];// 通信実行xmlHttpRequest.send(JSON.stringify(data));});};const Container = () => [css`display: flex;justify-content: flex-start;`];const item = () => [css`text-align: center;width: 100%;border: 1px solid black;`];