【FetchAPI】React/TypeScriptでGET,POST,PUT,DELETEをする【C#】
はじめに
Reactを利用して、APIをGET,POST,PUT,DELETEする方法をまとめます。
Axiosは比較的多く情報があったのですが、Fetch APIは日本語であまりなかったので、まとめておきます。
本記事では、【C#】SQL Serverと.NETのAPIをDockerで動かす方法で作成したAPIを使うことがあります。
良ければこちらもご覧ください。
プロジェクトを作る
今回は、Viteを使ってプロジェクトを作りました。
- 以下を実行
npm create vite
- 以下を選択
React
と、TypeScript
を選択します。
GET
まず、基本のGetからやってみましょう。
Sampleコードで試してみる
- ファイルを作る
今回はGetAPI.tsx
としました。 - GetAPI.tsxに以下を書く
参考サイトでは、型定義をしていなかったので、型定義をしたものに変更しています。
また、constからfunctionに変更しています。
(+にしている部分です)
import { useState, useEffect } from 'react' + type Sample = { + id: number; + title: string; + } - const Fetch = () => { + function GetAPI() { - const [posts, setPosts] = useState([]) + const [posts, setPosts] = useState<Sample[]>([]) useEffect(() => { fetch('https://jsonplaceholder.typicode.com/posts', { method: 'GET' }) .then(res => res.json()) .then(data => { setPosts(data) }) }, []) return ( <div> <ul> { posts.map(post => <li key={post.id}>{post.title}</li> ) } </ul> </div> ) } - export default Fetch; + export default GetAPI;
- App.tsxに以下を書く
<GetAPI />
自分のAPIにつなげてみよう
【C#】SQL Serverと.NETのAPIをDockerで動かす方法で作成したAPIを使っている方は、URLの部分を、http://localhost:XXXX/api/books
とすればOKです。
GetAPIの全コード
import { useState, useEffect } from 'react'
type Sample = {
id: number;
title: string;
}
function GetAPI() {
const [posts, setPosts] = useState<Sample[]>([])
useEffect(() => {
fetch('http://localhost:XXXX/api/books', { method: 'GET' })
.then(res => res.json())
.then(data => {
setPosts(data.items)
})
}, [])
return (
<div>
<ul>
{
posts.map(post =>
<li key={post.id}>{post.title}</li>
)
}
</ul>
</div>
)
}
export default GetAPI;
POST
次に、Postをやってみましょう。
Sampleコードで試してみる(axiosからfetchへ)
- ファイルを作る
今回は、PostAPI.tsx
としました。 - PostAPI.tsxに以下を書く
以下のコードは、参考サイトからの引用です。
axiosでやっていますが、まず動作確認としてaxiosでやってみましょう。
import React from 'react'; import axios from 'axios'; export default class PersonList extends React.Component { state = { name: '', } handleChange = event => { this.setState({ name: event.target.value }); } handleSubmit = event => { event.preventDefault(); const user = { name: this.state.name }; axios.post(`https://jsonplaceholder.typicode.com/users`, { user }) .then(res => { console.log(res); console.log(res.data); }) } render() { return ( <div> <form onSubmit={this.handleSubmit}> <label> Person Name: <input type="text" name="name" onChange={this.handleChange} /> </label> <button type="submit">Add</button> </form> </div> ) } }
ブラウザのコンソールで、以下のように表示されればOKです。
- 2つのデータを送信できるようにする
以下の様に変更します。
state = {
- name: '',
+ name: '',
+ age: ''
}
handleChange = event => {
- this.setState({ name: event.target.value });
+ const { name, value } = event.target;
+ this.setState({ [name]: value });
}
const user = {
- name: this.state.name
+ name: this.state.name,
+ age: this.state.age
};
+ <label>
+ Person Age:
+ <input type="text" name="age" onChange={this.handleChange} />
+ </label>
- axiosからfetchに変更する
- axios.post(`https://jsonplaceholder.typicode.com/users`, { user })
- .then(res => {
- console.log(res);
- console.log(res.data);
- })
+ fetch('https://jsonplaceholder.typicode.com/users', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(user)
+ })
+ .then(data => {
+ console.log(data);
+ })
PostAPI.tsxの全コード
import React from 'react';
export default class PersonList extends React.Component {
state = {
name: '',
age: '',
}
handleChange = event => {
const { name, value } = event.target;
this.setState({ [name]: value });
}
handleSubmit = event => {
event.preventDefault();
const user = {
name: this.state.name,
age: this.state.age
};
fetch('https://jsonplaceholder.typicode.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(user)
})
.then(data => {
console.log(data);
})
}
render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<label>
Person Name:
<input type="text" name="name" onChange={this.handleChange} />
</label>
<label>
Person Age:
<input type="text" name="age" onChange={this.handleChange} />
</label>
<button type="submit">Add</button>
</form>
</div>
)
}
}
自分のAPIにつなげてみよう
APIは以下を使っています。
【C#】SQL Serverと.NETのAPIをDockerで動かす方法
- 変数を書き換える
以下のように書き換えます。
なお、authorやtitleなどは、【C#】SQL Serverと.NETのAPIをDockerで動かす方法のAPIを使用しているので、ご自分のコードがある方は、適切な変数に変更してください。
import React from 'react';
export default class BookList extends React.Component {
state = {
author: '',
title: '',
}
handleChange = (event: { target: { name: any; value: any; }; }) => {
const { name, value } = event.target;
this.setState({ [name]: value });
}
handleSubmit = (event: { preventDefault: () => void; }) => {
event.preventDefault();
const book = {
author: this.state.author,
title: this.state.title
};
fetch('http://localhost:XXXX/api/books', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(book)
})
.then(data => {
console.log(data);
})
}
render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<label>
Book title:
<input type="text" name="title" onChange={this.handleChange} />
</label>
<label>
Book author:
<input type="text" name="author" onChange={this.handleChange} />
</label>
<button type="submit">Add</button>
</form>
</div>
)
}
}
PUT
Sampleコードで試してみる(axiosからfetchへ)
- ファイルを作る
今回は、PutAPI.tsx
としました。 - PutAPI.tsxに以下を書く
Put / Update Request with Axios | Update Data with Axios and React JSより引用したコードです。
idは固定になっていますが、Update出来ます。
import axios from "axios" import { useEffect, useState } from "react" function PutAPI() { const [post,setPost] = useState({ title: '', body: '' }) useEffect(() => { axios.get('https://jsonplaceholder.typicode.com/posts/1') .then(res => console.log(res.data)) }, []) const handleInput = (event) =>{ setPost({...post,[event.target.name]: event.target.value}) } function handleSubmit(event){ event.preventDefault() axios.put('https://jsonplaceholder.typicode.com/posts/1',{post}) .then(res => console.log(res.data)) .catch(err => console.log(err)) } return ( <div> <div> <form onSubmit={handleSubmit}> Title:<input type="text" onChange={handleInput} name="title" /> Body:<input type="text" onChange={handleInput} name="body" /> <button type="submit">Submit</button> </form> </div> </div> ) } export default PutAPI
- fetchに変える
2個所を変える必要があります。
Getの方にcatchをどちらも加えています。
まず、Getの部分です。
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error));
次に、Putの部分です。
fetch('https://jsonplaceholder.typicode.com/posts/1', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ post })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error));
- idをformの値で指定できるようにする
以下の部分を変更します。
+ const [id, setId] = useState(1);
useEffect(() => {
- fetch('https://jsonplaceholder.typicode.com/posts/1', {
+ fetch(`https://jsonplaceholder.typicode.com/posts/${id}`)
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error));
- }, [])
+ }, [id])
~~~
+ const handleIdChange = (event) => {
+ setId(event.target.value);
+ }
~~~
- fetch('https://jsonplaceholder.typicode.com/posts/1', {
+ fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
~~~
<form onSubmit={handleSubmit}>
+ ID:<input type="number" onChange={handleIdChange} value={id} />
自分のAPIにつなげてみよう
- PutAPI.tsxのコードを書き換える
【C#】SQL Serverと.NETのAPIをDockerで動かす方法で作成したAPIを使っている方は、以下を変更すればOKです。
- URLの部分を、
http://localhost:XXXX/api/books
- 変数の部分を
Body
からAuthor
,id
からbookId
にする -
.then(response => response.json())
を削除する
PutAPIの全コード
import { useEffect, useState } from "react"
function PutAPI() {
const [items, setItem] = useState({
title: '',
author: ''
})
const [bookId, setId] = useState(1);
useEffect(() => {
fetch(`http://localhost:XXXX/api/books/${bookId}`)
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error));
}, [bookId])
const handleInput = (event) => {
setItem({ ...items, [event.target.name]: event.target.value })
}
const handleIdChange = (event) => {
setId(event.target.value);
}
function handleSubmit(event) {
event.preventDefault()
fetch(`http://localhost:XXXX/api/books/${bookId}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(items)
})
.then(data => {
console.log(data);
})
.catch(error => console.log(error));
}
return (
<div>
<div>
<form onSubmit={handleSubmit}>
ID:<input type="number" onChange={handleIdChange} value={bookId} />
Title:<input type="text" onChange={handleInput} name="title" />
Author:<input type="text" onChange={handleInput} name="author" />
<button type="submit">Submit</button>
</form>
</div>
</div>
)
}
export default PutAPI
DELETE
Sampleコードで試してみる(axiosからfetchへ)
- ファイルを作る
今回は、DeleteAPI.tsx
としました。 - コードに追記する
以下のコードは、参考サイトからの引用です。
axiosでやっていますが、まず動作確認としてaxiosでやってみましょう。
import React from 'react'; import axios from 'axios'; export default class PersonList extends React.Component { state = { id: '', } handleChange = event => { this.setState({ id: event.target.value }); } handleSubmit = event => { event.preventDefault(); axios.delete(`https://jsonplaceholder.typicode.com/users/${this.state.id}`) .then(res => { console.log(res); console.log(res.data); }) } render() { return ( <div> <form onSubmit={this.handleSubmit}> <label> Person ID: <input type="text" name="id" onChange={this.handleChange} /> </label> <button type="submit">Delete</button> </form> </div> ) } }
- Fetchにしてみる
- axios.delete(`https://jsonplaceholder.typicode.com/users/${this.state.id}`)
- .then(res => {
- console.log(res);
- console.log(res.data);
- })
+ fetch(`https://jsonplaceholder.typicode.com/users/${this.state.id}`, {
+ method: 'DELETE',
+ })
+ .then(data => {
+ console.log(data);
+ })
自分のAPIにつなげてみよう
【C#】SQL Serverと.NETのAPIをDockerで動かす方法で作成したAPIを使っている方は、URLの部分を、http://localhost:XXXX/api/books
とすればOKです。
参考サイト
Getのコードは以下から引用しました。
【React】fetchを使ってapiからjsonデータを取得する(GETメソッド)
Post,Deleteのコードは以下から引用しました。
React でAxios を使用する方法
Putのコードは以下から引用しました。
Put / Update Request with Axios | Update Data with Axios and React JS
本記事で出てくる、自分のAPIにつなげてみようのAPIは以下を使用しています。
【C#】SQL Serverと.NETのAPIをDockerで動かす方法
関数コンポーネントとclass App extends Componentについては以下を参照すると良いと思います。
React入門でつまづいた ~function App()とclass App extends Componentの違い~
Discussion