React + Sinatraを試してみた
経緯
ポートフォリオはクライアントサイドだけで作ったのでサーバサイドと連携したものも試してみたいなと思った。
以前サイゼリヤ1000円作ったときにSinatraが手軽でいいなと思ったので、SinatraでAPI作ってReact(というよりはaxios)で叩くことを試してみた。
SinatraでJSONを返すAPI作成
require 'sinatra' before do response.headers['Access-Control-Allow-Origin'] = '*' end get '/' do content_type :json { key1: 'value1', key2: 'value2' }.to_json end
たったこれだけ!超短い。
CORS設定しないとネットワークエラーになってしまう。CORSについては別の機会にちゃんと勉強する(勉強するとは言ってない)
axiosで叩いて表示
import React from "react" import "./App.css" import axios from "axios" class App extends React.Component { state = { key1: "", key2: "" } handleClick = async () => { try { const response = await axios.get("http://localhost:4567/") const data = response.data this.setState({ key1: data.key1, key2: data.key2 }) } catch (e) { alert(e) } } render() { return ( <div className="App"> <button style={{ width: 200, height: 35 }} onClick={this.handleClick}> Sinatra呼び出し </button> <p>{this.state.key1}</p> <p>{this.state.key2}</p> </div> ) } } export default App
クライアント側。ボタンをクリックしたらaxiosでSinatraからJSONを取得して、結果をstateに入れて表示する。それだけ。
state = { key1: "", key2: "" }
stateの中身について上記のコードかconstructorかで宣言してあげないとkey1なんてないよと怒られてビルドできない。
所感
CORSのところと上記のstate周りでちょっとハマったけど、予想通りとても簡単にできた。素晴らしい。