社会不適合破壊的お味噌マン

くまのプーさんのような大人になりたいです!

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

ActiveRecordRuby 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層 - 物理層
物理的な接続。コネクタのピンの数、コネクタ形状の規定等。銅線-光ファイバ間の電気信号の変換等。

 

http://codezine.jp/static/images/article/7065/7065_01a_s.gif

 

引用元:Webサイト高速化に必要なHTTPの仕組みを理解する (1/4):CodeZine

 

HTTPリクエストが送信されると電気信号まで分解され、サーバーが応答した後電気信号がHTTPのリクエストを理解して必要なデータを返すという感じでしょうか。

 

HTTPと関連して動くもう一つのプロトコルがトランスファープロトコルと呼ばれ、主にTCPUDPというパケット型の通信。

パケットとは

データ通信ネットワークを流れるデータの単位で、伝送されるデータ本体に送信先の所在データなど制御情報を付加した小さなまとまりのこと。第三層のネットワーク層にあたるTCP/IPモデルが扱うデータの単位がパケットと呼ばれる。

 TCPUDPの違いは

TCP:通信の信頼性を保証する代わり、速度が遅い。webサイトやアプリケーションに使われる。

UDP:信頼性を保証せず、短時間で多くの通信を行う。主にストリーミング配信に使われる。

さて本題

HTTPは基本的に1つのリクエストに対して、1つのレスポンスを返す。

そのやり取りされるデータの中身は大きく3つの情報で構成されている。

1. リクエスト/レスポンス:どのようにデータを取得するかの要求内容とそれに対する返答

2. ヘッダー:通信相手にクライアント・サーバーに関する自身の状態や要求を示すためのメタデータ

3.通信相手に提供する実際のコンテンツ

 

1のリクエストでは3つの情報が渡される。

メソッドURIプロトコル

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について気がむいたら書きます。

HTTPセッションとTCP接続

身につけておきたいWebサイト高速化テクニック #2|検証ツールとそもそもHTTPって何だ編 | Developers.IO

Riding Rails: Edge Rails: PATCH is the new primary HTTP method for updates