ActiveRecord (Migration)
Migration
Rakefile
Rakeコマンドの設定
require 'active_record' require 'logger' #logger namespace :db do MIGRATIONS_DIR = 'db/migrate' #refer to this folder #connect the database ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => 'database/blog.sqlite' ) #outpt log ActiveRecord::Base.logger = Logger.new(STDOUT) #register migration desc "Migrate the database" task :migrate do ActiveRecord::Migrator.migrate(MIGRATIONS_DIR, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) end #register rollback desc 'Roll back the database schema to the previous version' task :rollback do ActiveRecord::Migrator.rollback(MIGRATIONS_DIR, ENV['STEP'] ? env['STEP'].to_i : 1) end end
0000_create_users.rb
class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.string :name, null: false t.string :email, null: false t.string :password, null: false t.timestamps end end def self.down drop_table :users end end
ActiveRecord(検証)
検証
validates フィールド名, 検証用ハッシュオブジェクト 存在:presence 長さ:length
存在してるか
class Post < ActiveRecord::Base validation :title, :presence => true end #Error post = Post.new(title: "aaa", body: "validation") post = Post.new(title: "aaa", body: "validation") post.valid? =>false p post.errors[:title] =>["can't be blank"] p post.errors.full_messages =>["Title can't be blank"] p post.errors.messages =>{:title=>["can't be blank"]} #Past post = Post.new(title: "aaa", body: "validation") true p post.errors[:title] =>[ ] p post.errors.full_messages =>[ ] p post.errors.messages =>{:title=>[ ]}
長さ検証 (length)
#長さが最低5文字の検証 class Post < ActiveRecord::Base validation :title, presence: true validates :body, length: { minimum: 5 } validates :password, length: { in: 6..20 }#6から20の間 validates :password, length: { is: 6 } #6と等しい end post = Post.new(title: "あああ", body: "va") p post.valid? =>false p post.errors[:body] =>["is too short (minimum is 3 characters)"] p post.errors.full_messages => ["Body is too short (minimum is 3 characters)"] p post.errors.messages =>{:body=>["is too short (minimum is 3 characters)"]}
数値かどうか(numericality)
class Post < ActiveRecord::Base validates :age, numericality: true validates :age, numericality: { only_integer: true } validates :age, numericality: { greater_than: 20 } validates :age, numericality: { less_than: 20 } end
:greater_than - 指定された値よりも大きくなければならないことを指定します。
:greater_than_or_equal_to - 指定された値と等しいか、それよりも大きくなければならないことを指定します。
:equal_to - 指定された値と等しくなければならないことを示します。
:less_than - 指定された値よりも小さくなければならないことを指定します。
:less_than_or_equal_to - 指定された値と等しいか、それよりも小さくなければならないことを指定します。
:odd - trueに設定されている場合は、奇数でなければなりません。
:even - trueに設定されている場合は、偶数でなければなりません。
acceptance
format
formatで正規表現に合う文字列以外にエラーを出す {with: 正規表現} class Post < ActiveRecord::Base validates :title, format: { with: /\A[a-zA-Z]+\z/, message: "英文字のみが使用できます" }, end post = Post.new(title: "あああ", body: "validation") post.save p post.valid? =>false p post.errors[:title] =>["英文字のみが使用できます"]
uniqueness 一意性の確保のためDBにすでに存在しているとエラーメッセージを出す。
class Post < ActiveRecord::Base validates :title, uniqueness: true validates :body, length: {minimum: 3} end post = Post.new(title: "Hahaha", body: "validation") post.save p post.valid? =>false p post.errors[:title] =>["has already been taken"]
confirmation
ActiveRecord
ActiveRecordはRuby on Rails用のO/RマッパーでObjectとRelational DataBaseのやり取りをマッピングする。
Active Recordには、モデルとデータベースのテーブルとのマッピング作成時に従うべきルールがいくつかあります。Railsでは、データベースのテーブル名を見つけるときに、モデルのクラス名を複数形にしたものを使用します。つまり、Bookというモデルクラスがある場合、これに対応するデータベースのテーブルは複数形のbooksになります。Railsの複数形化メカニズムは非常に強力で、不規則な語であっても複数形にしたり単数形にしたりできます(person <-> peopleなど)。モデルのクラス名が2語以上の複合語である場合、Rubyの慣習であるキャメルケース(CamelCaseのように語頭を大文字にしてスペースなしでつなぐ)に従ってください。一方、テーブル名は(camel_caseなどのように)小文字かつアンダースコアで区切られなければなりません。以下の例を参照ください。
データベースのテーブル - 複数形であり、語はアンダースコアで区切られる (例: book_clubs) モデルのクラス - 単数形であり、語頭を大文字にする (例: BookClub) モデル / クラス テーブル / スキーマ Post posts LineItem line_items Deer deers Mouse mice Person people
データベースのテーブル - 複数形であり、語はアンダースコアで区切られる (例: book_clubs)
モデルのクラス - 単数形であり、語頭を大文字にする (例: BookClub)
オブジェクトとの連携
#posts.sqlite create table posts ( id integer primary key autoincrement, title text, body text, created_at, updated_at );
#main.rb require 'active_record' #データベースとの接続 ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "./blog.sqlite" ) class Post < ActiveRecord::Base end
レコード挿入
#main.rb ##接続部分省略 post = Post.new(title: "Hello", body: "aaaaa") post.save post2 = Post.new post2.title = "second" post2.body = "Yeah" post2.save post3 = Post.new do |p| p.title = "post3" p.body = "bodybody" end post3.save post4 = Post.create(title: "post4", body: "saddasaaa")
データ抽出
#main.rb ##接続部分省略 ###すべてのレコード p Post.all ###最初のレコード p Post.first result=> :> ruby main.rb #<Post id: 1, title: "Hello", body: "aaaaa", created_at: "2015-04-14 17:10:57.750168", updated_at: "2015-04-14 17:10:57.750168"> ###最後のレコードとそのタイトル p Post.last.tilte (フィールド名) result=> :> ruby main.rb 17 ###条件から探す(find) p Post.find(3) =>result :> ruby main.rb #<Post id: 3, title: "Hello", body: "aaaaa", created_at: "2015-04-14 17:14:18.772831", updated_at: "2015-04-14 17:14:18.772831"> p Post.find_by_title("second") :> ruby main.rb #<Post id: 9, title: "second", body: "Yeah", created_at: "2015-04-14 17:22:46.318314", updated_at: "2015-04-14 17:22:46.318314"> *find_by_(フィールド名)_and_(フィールド名) p Post.find_by_title_and_id("second", 9) :> ruby main.rb #<Post id: 9, title: "second", body: "Yeah", created_at: "2015-04-14 17:22:46.318314", updated_at: "2015-04-14 17:22:46.318314"> ###条件から探す(where) p Post.where(title: "second") #find_by_titleより書きやすい、複数抽出できる :> ruby main.rb #<ActiveRecord::Relation [#<Post id: 9, title: "second", body: "Yeah", created_at: "2015-04-14 17:22:46.318314", updated_at: "2015-04-14 17:22:46.318314">, #<Post id: 11, title: "second", body: "Yeah", created_at: "2015-04-14 17:23:12.256308", updated_at: "2015-04-14 17:23:12.256308">, #<Post id: 15, title: "second", body: "Yeah", created_at: "2015-04-14 17:24:09.661676", updated_at: "2015-04-14 17:24:09.661676">]> p Post.where(:title => "title1", :id => 1) p Post.where("title = ? and id = ?", "title1", 1) p Post.where("title = :title and id = :id", {:title => "title1", :id =>1}) #比較演算子(代入以外不可) p Post.where("id > ?", 5) =>? に5を代入、(id > 5)ではエラーが出る #like(代入以外不可) p Post.where("title like ?", "%4")
レコード更新
post = Post.find(1) #更新したいレコードを見つける #post.update_attribute :title, "yes" #1つのフィールドを変更する場合 post.update_attributes title: "ok", body: "keioka"#2つ以上の場合 attributes Post.where(:id => 1..2).update_all(:title => "nnn2", :body => "hhh2")
Railsでは括弧が省略されている事が多い
レコード削除
#main.rb #delete(id_or_array) #delete_all(conditions = nil) #destroy(id) #destroy(condition = nil) #delete(id or array or range) Post.delete(1) Post.delete(1..4) #delete_all Post.delete_all(body: "aaaaa") #destroy(id) Post.destroy(9) #destroy(condition = nil) Post.destroy(id: 18)
Active Record: The Rails Database Bridge - Tuts+ Code Tutorial
検証
#validation ##存在してるか class Post < ActiveRecord::Base validation(:title, :presence => true) end #Error post = Post.new(title: "aaa", body: "validation") post = Post.new(title: "aaa", body: "validation") post.valid? =>false p post.errors[:title] =>["can't be blank"] p post.errors.full_messages =>["Title can't be blank"] p post.errors.messages =>{:title=>["can't be blank"]} #Past post = Post.new(title: "aaa", body: "validation") true p post.errors[:title] =>[ ] p post.errors.full_messages =>[ ] p post.errors.messages =>{:title=>[ ]} ##長さ検証 () class Post < ActiveRecord::Base validation :title, :presence => true validates :body, :length => { :minimum => 5 } end
Javascript超基礎メモ
データ型
- String
- Number
- Boolean (true / false)
- Object - Array - Function
- undefined
- null
複数の変数を宣言する
var msg = "hello world!" , x = 20 , y = 10;
三項演算子の省略
>var msg = (10 > 5) ? "Yes" : "No" >console.log(msg); Yes
Switch文
var fruits = "apple"; switch(fruits){ case "apple": console.log("You like apple"); break; case "orange": //並べて書くことで複数指定できる case "peach": console.log("me too"); break; default: //default (elseのような)値 console.log("I don't like it"); break; }
do while
var condition = false do { console.log("yeah!!"); } while (condition)
for continue
for (var i = 0; i < 10; i++) { if (i === 5) { // break; continue; //5だけスキップ } console.log(i); }
即時関数
宣言後に呼びださなくてもすぐ実行される。
(function(name) { console.log("hello " + name); })("Kei"); */ (function() { var x = 20, y = 20; console.log(x + y); })();
Array要素追加・取り出しメソッド
// unshift -> array <- push // shift <- array -> pop
sqlite基礎コマンド
Sqliteのデータ型
- NULL
- INTERGER (整数)
- REAL (小数)
- TEXT (文字列)
- BLOB(Binary Large Object)
データベースの作成
$ sqlite3 blog.sqlite3
sqlite3(コマンド) データベース名.sqlite3(拡張子)
.help =>ヘルプを出す .exit =>終了 .table =>テーブル確認 .schema =>テーブルの構成確認
テーブルを作成する
create table テーブル名 (カラム, カラム); <-
sqlite> create table users (name, email);
テーブルの確認
##テーブル確認 sqlite> .tables users ##.schema テーブル名指定 sqlite> .schema users CREATE TABLE users (name, email); ##.schema テーブル全表示 sqlite> .schema CREATE TABLE users (name, email); CREATE TABLE posts (title, content);
テーブルの削除
sqlite> drop table posts; sqlite> .tables users
テーブル名の変更
alter table users(テーブル名) rename(名前変更) to userss(変更したい名前);
sqlite> alter table users rename to userss; sqlite> .tables userss sqlite> alter table userss rename to users; sqlite> .tables users
カラムの追加
sqlite> alter table users add column password; sqlite> .schema users CREATE TABLE "users" (name, email, password);
データ型の指定
sqlite> create table category(id integer, category text); sqlite> .schema category CREATE TABLE category(id integer, category text);
データ挿入
sqlite> insert into users (id, email) values (1, 'keioka@yahoo.com'); insert into テーブル名 カラム名 value 値
主キーとオートインクリメント
sqlite> create table users(id integer primary key autoincrement, name text); sqlite> .schema users CREATE TABLE users(id integer primary key autoincrement, name text);
Validation (unique と not null)
##引数にunique と not null sqlite> create table users (id integer primary key autoincrement, name text not null, email text not null unique, password text not null); sqlite> insert into users (name, email) values ('keioka', 'keioka0828@gmail.com'); Error: NOT NULL constraint failed: users.password sqlite> insert into users (name, email, password) values ('keioka', 'keioka0828@gmail.com', '00000'); Error: UNIQUE constraint failed: users.email ##check(condition) age check(age>20) sqlite> create table users (id integer primary key autoincrement, name text default "Anonymous", age check(age>20), email text not null unique, password text not null); sqlite> insert into users (age, email, password) values (18, 'a', '00000'); Error: CHECK constraint failed: users
Default値設定
##引数に default と default値 sqlite> create table users (id integer primary key autoincrement, name text default "Anonymous", email text not null unique, password text not null);
レコード確認
## * 全部 sqlite> select * from users; 1|kei|23|keioka@gmail.com|00000 2|Tom|32|Tom@mail|00000 ##select カラム名 sqlite> select age from users; 23 32 ##order by sqlite> select * from users order by age; 1|Anonymous|23|keioka|08000 4|Max|27|max@mail|00000 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 6|Jason|33|jason@mail|00000 5|Jack|43|jack@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000 sqlite> select * from users order by age desc; 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 1|Anonymous|23|keioka|0000
limit
sqlite> select * from users limit 3; 1|Anonymous|23|keioka|00000 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000
where
sqlite> select * from users where age > 30 ; 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000
等価記号
## カラム名 = 値 sqlite> select * from users where name = 'Tom'; 2|Tom|32|Tom@mail|00000 ## カラム名 <> 値 以外 sqlite> select * from users where name <> 'Tom'; 1|Anonymous|23|keioka|082889 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000 ## カラム名 like 値 'k%' => kから始まる文字列 '%n'=>nで終わる文字列 sqlite> select * from users where name like '%n'; 3|Son|32|ssss@mail|00000 6|Jason|33|jason@mail|00000
組み込み関数
#count sqlite> select count (*) from users; 8 #max/min sqlite> select max(age) from users; 65 sqlite> select min(age) from users; 23 #random sqlite> select random(); -7218996632607330733 ##ランダムで1ユーザーを取り出す sqlite> select * from users order by random() limit 1; 4|Max|27|max@mail|00000 #length ##名前が長い順に並び変える sqlite> select * from users order by length(name) desc; 1|Anonymous|23|keioka|082889 6|Jason|33|jason@mail|00000 5|Jack|43|jack@mail|00000 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000 #typeof sqlite> select typeof(name) from users; text text text text text text text text
SQLite Query Language: Core Functions
データの集計
#例 name| score | team kei|89|A Tom|59|B Jason|49|A Takeshi|67|B Kob|43|A Lok|83|B sdsra|23|A fasa|13|B ##distinct =>ユニークな値を返す。 sqlite> select distinct team from users; A B ##sum(カラム名) sqlite> select sum(score) from users; 426 ##group by (カラム名) => ユニークな値ごとにまとめる sqlite> select team, sum(score) from users group by team; A|204 B|222
日付
##current_time sqlite> select current_time; 23:50:45 ##current_timestamp sqlite> select current_timestamp; 2015-04-13 23:51:02 ##strftime sqlite> select strftime('%Y年%m月%d日%w曜日', current_timestamp); 2015年04月13日1曜日 [https://www.sqlite.org/lang_datefunc.html:title]
レコード更新
update users set name = 'kei' where id = 1;
update テーブル名 set カラム = 値, カラム = 値 (複数可) where カラム= 値;
テーブルのカラムを”値”にセットしてください。カラムが”値”のところ。
sqlite> select * from users; 1|Anonymous|23|keioka|082889 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000 sqlite> update users set name = 'kei' where id = 1; sqlite> select * from users; 1|kei|23|keioka|082889 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000
レコード削除
##条件を指定して削除 sqlite> select * from users; 1|kei|23|keioka|082889 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 7|Bob|65|bob@mail|00000 8|Com|65|compm@mail|00000 sqlite> delete from users where age > 60; sqlite> select * from users; 1|kei|23|keioka|082889 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 ##ROWIDを使った削除 sqlite> select * from users; 1|kei|23|keioka|082889 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 4|Max|27|max@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000 sqlite> delete from users where ROWID = 4; sqlite> select * from users; 1|kei|23|keioka|082889 2|Tom|32|Tom@mail|00000 3|Son|32|ssss@mail|00000 5|Jack|43|jack@mail|00000 6|Jason|33|jason@mail|00000
複数テーブル
sqlite> select * from games; 1|70 1|50 1|56 1|76 1|96 2|66 2|64 2|34 2|14 2|84 3|94 3|64 3|84 3|87 sqlite> select * from users games; 1|keioka|A 2|Tom|A 3|Mof|B sqlite> select id, name, team, sum(score) from users, games where users.id = games.user_id group by users.id; 1|keioka|A|348 2|Tom|A|262 3|Mof|B|418 sqlite> select score, name from users,games where users.id = games.user_id; 70|keioka 50|keioka 56|keioka 76|keioka 96|keioka 66|Tom 64|Tom 34|Tom 14|Tom 84|Tom 94|Mof 64|Mof 84|Mof 87|Mof 89|Mof
データベースについて(sqlite)
データベース:アプリごとに作るデータが入ったもの
テーブル:カテゴリー分けされたデータが格納されたもの(ユーザーについてのテーブル、投稿についてのテーブル)
フィールド/カラム:列(項目)
レコード:行
例
ブログデーターベース
ユーザーテーブル
↓フィールド/カラム:列(項目) | ID | ユーザー名 | アドレス |
---|---|---|---|
(→レコード) | 1 | keioka | aaa@gmail.com |
2 | hohoo | hooo.dd@gmail.com | |
3 | adoo | adoo.dd@gmail.com |
投稿テーブル
ID | タイトル | 内容 |
---|---|---|
1 | データベースについて | データーベースとはデーターベースとはデーターベースとはデーターベースとは |
2 | HTMLとCSS | HTMLCSSHTMLCSSHTMLCSSHTMLCSS |
3 | javascript | javascriptでのDOM操作javascriptでのDOM操作javascriptでのDOM操作javascriptでのDOM操作 |
HTTPとは
HTTPとはパソコンやスマートフォンからwebを閲覧する際に利用される通信手段(通信プロトコル)。
通信プロトコルとはネットワーク上で通信するための手順や規約のこと
通信プロトコルとは 「プロトコル, ネットワークプロトコル, 通信規約」 (protocol): - IT用語辞典バイナリ
HTTPはOSI参照モデルの第7層にあたる通信機能。以下wikipediaより
- 国際標準化機構(ISO)によって策定された、コンピュータの持つべき通信機能を階層構造に分割したモデルである。OSI基本参照モデル、OSIモデルなどとも呼ばれ、通信機能(通信プロトコル)を7つの階層に分けて定義している。
- 第7層 - アプリケーション層
- 具体的な通信サービス(例えばファイル・メールの転送、遠隔データベースアクセスなど)を提供。HTTPやFTP等の通信サービス。
- 第6層 - プレゼンテーション層
- データの表現方法(例えばEBCDICコードのテキストファイルをASCIIコードのファイルへ変換する)。
- 第5層 - セッション層
- 通信プログラム間の通信の開始から終了までの手順(接続が途切れた場合、接続の回復を試みる)。
- 第4層 - トランスポート層
- ネットワークの端から端までの通信管理(エラー訂正、再送制御等)。
- 第3層 - ネットワーク層
- ネットワークにおける通信経路の選択(ルーティング)。データ中継。
- 第2層 - データリンク層
- 直接的(隣接的)に接続されている通信機器間の信号の受け渡し。
- 第1層 - 物理層
- 物理的な接続。コネクタのピンの数、コネクタ形状の規定等。銅線-光ファイバ間の電気信号の変換等。
引用元:Webサイト高速化に必要なHTTPの仕組みを理解する (1/4):CodeZine
HTTPリクエストが送信されると電気信号まで分解され、サーバーが応答した後電気信号がHTTPのリクエストを理解して必要なデータを返すという感じでしょうか。
HTTPと関連して動くもう一つのプロトコルがトランスファープロトコルと呼ばれ、主にTCPとUDPというパケット型の通信。
パケットとは
データ通信ネットワークを流れるデータの単位で、伝送されるデータ本体に送信先の所在データなど制御情報を付加した小さなまとまりのこと。第三層のネットワーク層にあたるTCP/IPモデルが扱うデータの単位がパケットと呼ばれる。
TCP:通信の信頼性を保証する代わり、速度が遅い。webサイトやアプリケーションに使われる。
UDP:信頼性を保証せず、短時間で多くの通信を行う。主にストリーミング配信に使われる。
さて本題
HTTPは基本的に1つのリクエストに対して、1つのレスポンスを返す。
そのやり取りされるデータの中身は大きく3つの情報で構成されている。
1. リクエスト/レスポンス:どのようにデータを取得するかの要求内容とそれに対する返答
2. ヘッダー:通信相手にクライアント・サーバーに関する自身の状態や要求を示すためのメタデータ
3.通信相手に提供する実際のコンテンツ
1のリクエストでは3つの情報が渡される。
GET /index.html HTTP/1.1
GET--->> メソッド
/index.html -->> URI
HTTP/1.1 --->>プロトコル
主要なHTTP/1.1メソッド
GET: webを閲覧するときに情報を要求するときに使われるメソッド
POST: サーバー側に情報を送り、変更を加えたいときに使うメソッド
HEAD: ボディのないヘッダのみを要求するメソッド
1のレスポンスでも3つの情報が返ってくる
HTTP/1.1 200 OK
HTTP/1.1 -->> プロトコル
200 -->> ステータスコード
OK -->> メッセージ
コード | ステータス |
---|---|
200 | リクエストが成功し、要求したドキュメントが返ってきたとき。 |
304 | ドキュメントが更新されていれば新しいドキュメントを返すようリクエストしたが、 更新されていない場合に返ってくるステータスコード。 |
403 | アクセス権がないときなど、実行を拒否したとき。 |
404 | 要求したURIに一致するリソースが見つからなかったとき。 |
500 | サーバー内でのエラーにより処理できないとき。 |
503 | サーバーの過負荷かメンテナンスで処理できないとき。 |
引用元:Webサイト高速化に必要なHTTPの仕組みを理解する (2/4):CodeZine
404は結構見ますね。。
ちなみに
また、ステータスコードはエラーの状態を確認するだけではなく、ファイルのキャッシュ状態を確認する場合にも利用できます。
確認方法は別の回で紹介しますが、簡単に説明すると「200」か「304」かでファイルをサーバーからロードしているのか、ローカルキャッシュを利用しているのか判断することができます。
304はキャッシュされているデータということでしょうか。
2のヘッダー情報を以下のようです。
項目名 | リクエスト/レスポンス | 説明 |
---|---|---|
Accept | リクエスト | 受信可能なデータ形式をサーバーに通知します。 |
Cache-Control | リクエスト/レスポンス | キャッシュに関する指示をサーバーに通知します。 |
Connection | リクエスト/レスポンス | 接続的接続(Keep-Alive)のサポート状態を サーバーに通知します。 |
Accept-Encoding | リクエスト | ブラウザが受信可能なエンコード方式(gzip)を サーバーに通知します。 |
Content-Encoding | リクエスト/レスポンス | コンテンツのエンコード方式(gzip)を サーバーに通知します。 |
Content-Type | リクエスト/レスポンス | MIMEタイプを通知します。 |
Date | リクエスト/レスポンス | 応答を返す時刻を通知します。 |
Expires | リクエスト/レスポンス | ロードしたコンポーネント(画像やCSS,JavaScriptなど)の キャッシュ期限を通知します。 |
Host | リクエスト | HTTP1.1で必須とされている項目です。 サーバーに対して要求しているホスト名を通知します。 |
If-Modified-Since | リクエスト | クライアント側にキャッシュがある場合、 新しいものがあれば転送するようサーバー側に要求します。 新しいものがなければ304のステータスコードを返し、 引き続きクライアント側のキャッシュを利用します。 |
Etags | レスポンス | キャッシュされているコンポーネントが、 Webサーバー上のオリジナルと一致しているか検証します。 |
Last-Modified | リクエスト/レスポンス | コンポーネントが最後に更新された時刻を通知します。 |
Referer | リクエスト | 要求元になったページのURLをサーバー側に通知します。 |
User-Agent | リクエスト | ブラウザのユーザーエージェントをサーバーに通知します。 |
Warning | リクエスト/レスポンス |
ワーニングとメッセージを通知します。 |
HTMLのリクエストヘッダー
Host: dev.classmethod.jp
Connection: keep-alive
Cache-Control: max-age=0
If-Modified-Since: Sun, 13 Jan 2013 15:49:45 GMT
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
Accept: */*
Referer: http://dev.classmethod.jp/web_acceleration_sample/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Accept-Charset: UTF-8,*;q=0.5
Cookie: logged_in=yes
レスポンスヘッダー
Server: dev.classmethod.jp
Date: Thu, 17 Jan 2013 12:37:45 GMT
Content-Type: image/png
Content-Length: 1312
Last-Modified: Sun, 13 Jan 2013 15:49:45 GMT
Connection: keep-alive
Expires: Fri, 18 Jan 2013 12:37:45 GMT
Cache-Control: max-age=86400
Accept-Ranges: none
引用ばっかですいません
HTTPボディは
リクエストの場合は主にPOSTメソッドなどでデータの送信に利用し、レスポンスの際はHTMLなどが入ります。
以下時間あるときに読みたい。RESTについて気がむいたら書きます。
身につけておきたいWebサイト高速化テクニック #2|検証ツールとそもそもHTTPって何だ編 | Developers.IO
Riding Rails: Edge Rails: PATCH is the new primary HTTP method for updates