HTTP
日本語 | 超文書転送規約 |
英語 | Hypertext Transfer Protocol |
ふりがな | えっちてぃーてぃーぴー、えいちてぃーてぃーぴー |
フリガナ | エッチティーティーピー、エイチティーティーピー |
ホームページの送受信を規定したプロトコル。
RFCによって規定されているプロトコルのひとつ。
ホームページと、それに付随した画像等の送受信方法の「仕様」。
基本的には、ネットワークを使用して文字列の送受信でホームページを取得する。
telnetアプリケーションや、プログラムであればソケットを用いて、文字列で「どのホームページが欲しい!」というメッセージを送信することで、サーバーからホームページが返される。
この時の「どういう形式で頼めばホームページが返されるか」ということを決めたものが、HTTPである。
また逆に言うと、サーバーはこのHTTPの「どういう風に頼まれたらホームページを返さなければならない」という仕様に則って作られなければならない。そうしてHTTPの仕様に則った「ホームページを返すサーバー」を「HTTPサーバー」「Webサーバー」と呼ぶ。
HTTPによる送信は、まずソケットを用いて送信先サーバーに接続後、「これこれをして欲しい」というメッセージを送信する。これを「リクエスト」と呼ぶ。
リクエストでは、まず「HTTPメソッド」「取得するページ」「プロトコルとバージョン」を送信する。
続いて「リクエストヘッダー」として各種情報を送信する。リクエストヘッダーでは、情報取得のために必要な諸情報を送信する。
「POST」のように「情報の送信」を目的とするHTTPメソッドでは、改行文字を挟んで送信する情報を付加する。
最後に改行文字を送信すると
その後、サーバーから情報が返されてくるため、これを受け取る。
以上の「手順」や、その際に送信する文章の形式を取り決めたものがHTTPという「仕様」ということである。
HTTPには様々なバージョンがある。そのうち、HTTP/1.1についてはRFC2616に規定されている。
RFCによって規定されているプロトコルのひとつ。
ホームページと、それに付随した画像等の送受信方法の「仕様」。
基本的には、ネットワークを使用して文字列の送受信でホームページを取得する。
telnetアプリケーションや、プログラムであればソケットを用いて、文字列で「どのホームページが欲しい!」というメッセージを送信することで、サーバーからホームページが返される。
この時の「どういう形式で頼めばホームページが返されるか」ということを決めたものが、HTTPである。
また逆に言うと、サーバーはこのHTTPの「どういう風に頼まれたらホームページを返さなければならない」という仕様に則って作られなければならない。そうしてHTTPの仕様に則った「ホームページを返すサーバー」を「HTTPサーバー」「Webサーバー」と呼ぶ。
HTTPによる送信は、まずソケットを用いて送信先サーバーに接続後、「これこれをして欲しい」というメッセージを送信する。これを「リクエスト」と呼ぶ。
リクエストでは、まず「HTTPメソッド」「取得するページ」「プロトコルとバージョン」を送信する。
続いて「リクエストヘッダー」として各種情報を送信する。リクエストヘッダーでは、情報取得のために必要な諸情報を送信する。
「POST」のように「情報の送信」を目的とするHTTPメソッドでは、改行文字を挟んで送信する情報を付加する。
最後に改行文字を送信すると
その後、サーバーから情報が返されてくるため、これを受け取る。
以上の「手順」や、その際に送信する文章の形式を取り決めたものがHTTPという「仕様」ということである。
HTTPには様々なバージョンがある。そのうち、HTTP/1.1についてはRFC2616に規定されている。
// Sample.java
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Sample
{
public static void main( String[] args )
{
// 接続先のホスト名(URLではありません)。
String host = "www.yahoo.co.jp";
// 接続時のポート番号。
int port = 80;
// リクエストのメソッド。
String method = "GET";
// リクエストURL。
String url = "/index.html";
// リクエストのプロトコル。
String protocol = "HTTP/1.1";
// 「Host」リクエストヘッダー。
String hostHeader = "Host:";
// Content-Typeの文字コード(注:実際には、HEADで文字コードを取得してから指定します)。
String charSet = "EUC-JP";
// ソケットクラス。
Socket socket = null;
// ホームページを取得するためのストリームクラス。
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
// 接続情報を送るためのストリームクラス。
OutputStreamWriter outputStreamWriter = null;
BufferedWriter bufferedWriter = null;
PrintWriter printWriter = null;
try
{
// 接続します。
socket = new Socket( host, port );
// ホームページ取得用ストリームクラスを準備します。
inputStreamReader = new InputStreamReader( socket.getInputStream(), charSet );
bufferedReader = new BufferedReader( inputStreamReader );
// リクエスト送信用ストリームクラスを準備します。
outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() );
bufferedWriter = new BufferedWriter( outputStreamWriter );
printWriter = new PrintWriter( bufferedWriter );
// リクエストを送信します。
// GET /index.html HTTP/1.1
// Host:www.yahoo.co.jp
// (改行のみ)
printWriter.println( method + " " + url + " " + protocol );
printWriter.println( hostHeader + host );
printWriter.println();
printWriter.flush();
// ホームページの情報を取得します。
String line = null;
do
{
line = bufferedReader.readLine();
if( line != null )
{
System.out.println( line );
}
}
while( line != null );
// HTTP/1.1 200 OK
// Date: Thu, 25 Aug 2005 11:19:55 GMT
// P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
// Expires: -1
// Pragma: no-cache
// Cache-Control: no-cache
// Connection: close
// Content-Type: text/html;charset=euc-jp
//
// <html>
// <head>
// <title>Yahoo! JAPAN</title>
// (以下略。HEADで取得した場合には、「Content-Type: text/html;charset=euc-jp」まで
// 取得できるので、この文字コードをInputStreamReaderクラスのコンストラクタの
// 第2引数に指定してください)
}
catch( UnknownHostException e )
{
e.printStackTrace();
}
catch( IOException e )
{
e.printStackTrace();
}
finally
{
// ストリーム及びソケットを閉じます。
if( printWriter != null )
{
printWriter.close();
}
try
{
if( bufferedWriter != null )
{
bufferedWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( outputStreamWriter != null )
{
outputStreamWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( bufferedReader != null )
{
bufferedReader.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( inputStreamReader != null )
{
inputStreamReader.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( socket != null )
{
socket.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Sample
{
public static void main( String[] args )
{
// 接続先のホスト名(URLではありません)。
String host = "www.yahoo.co.jp";
// 接続時のポート番号。
int port = 80;
// リクエストのメソッド。
String method = "GET";
// リクエストURL。
String url = "/index.html";
// リクエストのプロトコル。
String protocol = "HTTP/1.1";
// 「Host」リクエストヘッダー。
String hostHeader = "Host:";
// Content-Typeの文字コード(注:実際には、HEADで文字コードを取得してから指定します)。
String charSet = "EUC-JP";
// ソケットクラス。
Socket socket = null;
// ホームページを取得するためのストリームクラス。
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
// 接続情報を送るためのストリームクラス。
OutputStreamWriter outputStreamWriter = null;
BufferedWriter bufferedWriter = null;
PrintWriter printWriter = null;
try
{
// 接続します。
socket = new Socket( host, port );
// ホームページ取得用ストリームクラスを準備します。
inputStreamReader = new InputStreamReader( socket.getInputStream(), charSet );
bufferedReader = new BufferedReader( inputStreamReader );
// リクエスト送信用ストリームクラスを準備します。
outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() );
bufferedWriter = new BufferedWriter( outputStreamWriter );
printWriter = new PrintWriter( bufferedWriter );
// リクエストを送信します。
// GET /index.html HTTP/1.1
// Host:www.yahoo.co.jp
// (改行のみ)
printWriter.println( method + " " + url + " " + protocol );
printWriter.println( hostHeader + host );
printWriter.println();
printWriter.flush();
// ホームページの情報を取得します。
String line = null;
do
{
line = bufferedReader.readLine();
if( line != null )
{
System.out.println( line );
}
}
while( line != null );
// HTTP/1.1 200 OK
// Date: Thu, 25 Aug 2005 11:19:55 GMT
// P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
// Expires: -1
// Pragma: no-cache
// Cache-Control: no-cache
// Connection: close
// Content-Type: text/html;charset=euc-jp
//
// <html>
// <head>
// <title>Yahoo! JAPAN</title>
// (以下略。HEADで取得した場合には、「Content-Type: text/html;charset=euc-jp」まで
// 取得できるので、この文字コードをInputStreamReaderクラスのコンストラクタの
// 第2引数に指定してください)
}
catch( UnknownHostException e )
{
e.printStackTrace();
}
catch( IOException e )
{
e.printStackTrace();
}
finally
{
// ストリーム及びソケットを閉じます。
if( printWriter != null )
{
printWriter.close();
}
try
{
if( bufferedWriter != null )
{
bufferedWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( outputStreamWriter != null )
{
outputStreamWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( bufferedReader != null )
{
bufferedReader.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( inputStreamReader != null )
{
inputStreamReader.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( socket != null )
{
socket.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
// Sample.java import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.OutputStreamWriter; import java.io.BufferedWriter; import java.io.PrintWriter; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class Sample { public static void main( String[] args ) { // 接続先のホスト名(URLではありません)。 String host = "www.yahoo.co.jp"; // 接続時のポート番号。 int port = 80; // リクエストのメソッド。 String method = "GET"; // リクエストURL。 String url = "/index.html"; // リクエストのプロトコル。 String protocol = "HTTP/1.1"; // 「Host」リクエストヘッダー。 String hostHeader = "Host:"; // Content-Typeの文字コード(注:実際には、HEADで文字コードを取得してから指定します)。 String charSet = "EUC-JP"; // ソケットクラス。 Socket socket = null; // ホームページを取得するためのストリームクラス。 InputStreamReader inputStreamReader = null; BufferedReader bufferedReader = null; // 接続情報を送るためのストリームクラス。 OutputStreamWriter outputStreamWriter = null; BufferedWriter bufferedWriter = null; PrintWriter printWriter = null; try { // 接続します。 socket = new Socket( host, port ); // ホームページ取得用ストリームクラスを準備します。 inputStreamReader = new InputStreamReader( socket.getInputStream(), charSet ); bufferedReader = new BufferedReader( inputStreamReader ); // リクエスト送信用ストリームクラスを準備します。 outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() ); bufferedWriter = new BufferedWriter( outputStreamWriter ); printWriter = new PrintWriter( bufferedWriter ); // リクエストを送信します。 // GET /index.html HTTP/1.1 // Host:www.yahoo.co.jp // (改行のみ) printWriter.println( method + " " + url + " " + protocol ); printWriter.println( hostHeader + host ); printWriter.println(); printWriter.flush(); // ホームページの情報を取得します。 String line = null; do { line = bufferedReader.readLine(); if( line != null ) { System.out.println( line ); } } while( line != null ); // HTTP/1.1 200 OK // Date: Thu, 25 Aug 2005 11:19:55 GMT // P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" // Expires: -1 // Pragma: no-cache // Cache-Control: no-cache // Connection: close // Content-Type: text/html;charset=euc-jp // // <html> // <head> // <title>Yahoo! JAPAN</title> // (以下略。HEADで取得した場合には、「Content-Type: text/html;charset=euc-jp」まで // 取得できるので、この文字コードをInputStreamReaderクラスのコンストラクタの // 第2引数に指定してください) } catch( UnknownHostException e ) { e.printStackTrace(); } catch( IOException e ) { e.printStackTrace(); } finally { // ストリーム及びソケットを閉じます。 if( printWriter != null ) { printWriter.close(); } try { if( bufferedWriter != null ) { bufferedWriter.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( outputStreamWriter != null ) { outputStreamWriter.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( bufferedReader != null ) { bufferedReader.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( inputStreamReader != null ) { inputStreamReader.close(); } } catch( IOException e ) { e.printStackTrace(); } try { if( socket != null ) { socket.close(); } } catch( IOException e ) { e.printStackTrace(); } } } }
「解説」に含まれているページ
「サンプルプログラムとか」に含まれているページ
- <jsp:useBean>
- Cookie
- doGet
- doPost
- GET
- HEAD
- HTTP
- HttpServlet
- HttpServletRequest
- HttpServletResponse
- HttpSession
- JavaBeans
- JSP暗黙オブジェクト「request」
- JSP暗黙オブジェクト「session」
- POST
- RequestDispatcher
- ServletConfig
- ServletContext
- ServletException
- web.xml
- クッキー
- クロスサイトスクリプティング
- サニタイジング
- ステートレス
- セッション
- セッションID
- セッションスコープ
- ポート番号
- リクエスト
- リクエストスコープ
- リクエストパラメーター
- リクエストヘッダー
- レスポンス
- レスポンスヘッダー
- 入力フォーム