SlideShare a Scribd company logo
1 of 20
Download to read offline
REACT	&	WEB	API
RUBY舞鶴
26,	JUNE,	2016
SHIGERU	KONDOU
REACT学び⽅
書籍	「⼊⾨	React」	O'REILY	かなり古い	ES6	での書き
⽅が出ていない	現在	DOM	操作は	'react-dom'	に分かれ
ている
チュートリアル
とにかく書きまくる
おすすめ構成
ES6
Webpack
Webpack-dev-server
構築⽅法
Webpack	や	Webpack-dev-server の設定が⾯倒なので
boilerplate	を探すと良い。
例)	react-es6-webpack-boilerplate
$	git	clone	git@github.com:vasanthk/react-es6-webpack-boilerplate.git
$	cd	react-es6-webpack-boilerplate
$	npm	i
$	npm	start
簡単なサンプルを作る
⽅針
React	のチュートリアルは、⼊⼒フォームからの登録
と⼀覧表⽰ができるアプリなので	改造して	Rails	API
サーバに接続できるようにする。
せっかく	React	使うので	通信部分も	jQuery.ajax	でなく
fetch	を使う。
COMMENTBOX.JS
export	default	class	CommentBox	extends	React.Component	{
		constructor(props)	{
				super(props);
				this.state	=	{data:	[]};
				this.handleCommentSubmit	=	this.handleCommentSubmit.bind(this);
		}
		componentDidMount()	{
				fetch(this.props.url)
						.then((response)=>response.json())
						.then((json)=>{this.setState({data:	json});
						});
		}
		handleCommentSubmit(comment)	{
				console.log('handle	comment	submit',	comment);
				fetch(this.props.url,	{
						method:	'POST',
						headers:	{
								'Accept':	'application/json',
								'Content-Type':	'application/json'
						},
						body:	JSON.stringify(comment)
				})
全ソースは	https://github.com/cncgl/react-tutorial-client
COOMENTFORM.JS
export	default	class	CommentForm	extends	React.Component	{
		constructor(props)	{
				super(props);
				this.state	=	{author:	'',	text:	''};
				this.handleSubmit	=	this.handleSubmit.bind(this);
				this.handleAuthorChange	=	this.handleAuthorChange.bind(this);
				this.handleTextChange	=	this.handleTextChange.bind(this);
		}
		handleAuthorChange(e)	{
				this.setState({author:	e.target.value});
		}
		handleTextChange(e)	{
				this.setState({text:	e.target.value});
		}
		handleSubmit(e)	{
				e.preventDefault();
				const	author	=	this.state.author.trim();
				const	text	=	this.state.text.trim();
				if(	!text	||	!author)	{	return;	}
				this.props.onCommentSubmit({author:	author,	text:	text});
				this.setState({author:	'',	text:	''});
.bind(this)	は忘れがちなので注意
COMMENTLIST.JS
export	default	class	CommentList	extends	React.Component	{
		constructor(props)	{
				super(props);
		}
		render()	{
				console.log('props',	this.props);
				const	commentNodes	=	this.props.data.map(comment	=>
						(<Comment	author={comment.author}	key={comment.id}>
										{comment.text}
								</Comment>));
				return	(<div	className="commentList">{commentNodes}</div>);
		}
}
CommentList.propTypes	=	{	data:	React.PropTypes.array.isRequired	};
簡単なアプリを作る(サーバー
編)
WEB	API	(RAILS)
Rails	API	モード	Rails	5	は標準だが	4以下は	rails-api	gem
を使⽤する。
$	bundle	exec	rails	new	.	--skip-spring	--api
$	bundle
$	bundle	exec	rails	g	scaffold	comment	author	text
$	bundle	exec	rails	db:migrate
Active	Model	をJSON	にシリアライズ
$	vim	Gemfile
...
gem	'active_model_serializers'
...
$	bundle
Comment	モデルに対するシリアライザーの作成
$	bundle	exec	rails	g	serializer	comment
app/serializers/comment_serializer.rb
class	CommentSerializer	<	ActiveModel::Serializer
		attributes	:id
end
↓
class	CommentSerializer	<	ActiveModel::Serializer
		attributes	:id,	:author,	:text
end
app/controllers/application_controller.rb
class	ApplicationController	<	ActionController::API
end
↓
class	ApplicationController	<	ActionController::API
		include	ActionController::Serialization
end
COMMENT_CONTROLLER.RB
class	CommentsController	<	ApplicationController
		before_action	:set_comment,	only:	[:show,	:update,	:destroy]
		#	GET	/comments
		def	index
				@comments	=	Comment.all
				render	json:	@comments
		end
		#	GET	/comments/1
		def	show
				render	json:	@comment
		end
		#	POST	/comments
		def	create
				@comment	=	Comment.new(comment_params)
				if	@comment.save
						render	json:	@comment,	status:	:created,	location:	@comment
				else
全ソースは	https://github.com/cncgl/react-tutorial-server
参考
Building	the	Perfect	Rails	5	API	Only	App
http://sourcey.com/building-the-prefect-rails-5-api-only-
app/
DDoS	や	API	のバージョニング、認証についても書かれ
ているので⼀度⾒ておいてほしい
WEB	SERVER	と	API	SERVER	の構成
同⼀型
1つのサーバーで配信と	API	サーバーを兼ね備える。
SSR	があれば	html	を書き出す機能と	API	を返す機能のハ
イブリッドになる。
分離型
HTML,	JavaScript,	asset	を静的コンテンツのサーバに置
き、	API	サーバーとは分離する。	クロスドメイン制約が
あるため、JSONP	や	CORS	で対応する。
SSR	がある場合は	Rendering	Server	と	API	サーバーの構
成にする。
おさらいCORS(CROSS	ORIGIN	RESOURCE
SHARERING)
HTTPリクエストヘッダ
GET	/api	HTTP/1.1
Origin:	https://trustedsite.com
Origin	が信⽤できるサイトである場合レスポンスヘッダ
に
HTTP/1.1	200	OK
Access-Control-Allow-Origin:	https//trustedsite.com
を追加することによりブラウザでのアクセスが可能とな
る。
RAILS	に	RACK-CORS	を組み込む
$	vim	Gemfile
...
gem	'rack-cors'
...
$	bundle
config/application.rb
module	YourApp
		class	Application	<	Rails::Application
				#	...
				config.middleware.insert_before	0,	Rack::Cors	do
						allow	do
								origins	'*'
								resource	'*',	:headers	=>	:any,
										:methods	=>	[:get,	:post,	:delete,	:put,	:patch,	:options]
						end
				end
		end
end
まとめ
React	は	ES2015	と相性がよくすっきりかける
jQuery	と⼿を切るため	fetch	を使っていきたい
Rails	5	の	API	モード等で	API	サーバは作れる。
Active	Model	のシリアライズに	active_model_serializers	が
必要
配信と	API	を分ける場合は、クロスオリジン対策が必
要	Rails	ならば	rack-cors	が簡単

More Related Content

What's hot

Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみたTakeo Noda
 
WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebViewYuki Hirai
 
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方Yuta Matsumura
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたfirewood
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリMasaki Oshikawa
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancementkamiyam .
 
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworkerおれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworkerToshiaki Maki
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方Ryo Tomidokoro
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebViewTaketo Sano
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugToshiaki Maki
 
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱Kiyotaka Oku
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugYuji Kubota
 
第9回rest勉強会 ダウンロード・アップロード編
第9回rest勉強会 ダウンロード・アップロード編第9回rest勉強会 ダウンロード・アップロード編
第9回rest勉強会 ダウンロード・アップロード編ksimoji
 
Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編kimulla
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会Yuki Okada
 
<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー<第1回>Laravelハンズオンセミナー
<第1回>LaravelハンズオンセミナーTatsuyoshi Mashiko
 

What's hot (20)

Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
 
WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebView
 
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べた
 
laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリ
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworkerおれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
 
let UIWebView as WKWebView
let UIWebView as WKWebViewlet UIWebView as WKWebView
let UIWebView as WKWebView
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
 
Head toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjugHead toward Java 13 and Java 14 #jjug
Head toward Java 13 and Java 14 #jjug
 
第9回rest勉強会 ダウンロード・アップロード編
第9回rest勉強会 ダウンロード・アップロード編第9回rest勉強会 ダウンロード・アップロード編
第9回rest勉強会 ダウンロード・アップロード編
 
Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会
 
<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー
 

Similar to REACT & WEB API

React + Reduxで作る対話AI
React + Reduxで作る対話AIReact + Reduxで作る対話AI
React + Reduxで作る対話AIKentaro Tada
 
JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)taskie
 
RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~Kazuya Wada
 
React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話GIG inc.
 
react-scriptsはwebpackで何をしているのか
react-scriptsはwebpackで何をしているのかreact-scriptsはwebpackで何をしているのか
react-scriptsはwebpackで何をしているのか暁 三宅
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
第8回 天領倉敷 ScalaScala In Kurashiki 8
第8回 天領倉敷 ScalaScala In Kurashiki 8第8回 天領倉敷 ScalaScala In Kurashiki 8
第8回 天領倉敷 ScalaScala In Kurashiki 8NISHIMOTO Keisuke
 
Active job meets kubernetes
Active job meets kubernetesActive job meets kubernetes
Active job meets kubernetesYasutomo Uemori
 
Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成krdlab
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Ryo RKTM
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTKenichi Tachibana
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】WESEEKWESEEK
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発Nomura Yusuke
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.SmartNews, Inc.
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 

Similar to REACT & WEB API (20)

react_rails
react_railsreact_rails
react_rails
 
React + Reduxで作る対話AI
React + Reduxで作る対話AIReact + Reduxで作る対話AI
React + Reduxで作る対話AI
 
JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)
 
RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~
 
React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話
 
React Redux Redux-Saga + サーバサイドレンダリング
React Redux Redux-Saga + サーバサイドレンダリングReact Redux Redux-Saga + サーバサイドレンダリング
React Redux Redux-Saga + サーバサイドレンダリング
 
react-scriptsはwebpackで何をしているのか
react-scriptsはwebpackで何をしているのかreact-scriptsはwebpackで何をしているのか
react-scriptsはwebpackで何をしているのか
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
第8回 天領倉敷 ScalaScala In Kurashiki 8
第8回 天領倉敷 ScalaScala In Kurashiki 8第8回 天領倉敷 ScalaScala In Kurashiki 8
第8回 天領倉敷 ScalaScala In Kurashiki 8
 
Active job meets kubernetes
Active job meets kubernetesActive job meets kubernetes
Active job meets kubernetes
 
Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
Let's react
Let's reactLet's react
Let's react
 
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
Rails×React×TS で作るwebアプリ入門【weseek tech conf #10】
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 

REACT & WEB API