JavaA2Z

KAB-studio > プログラミング > JavaA2Z > POSTとは

POST

日本語 掲示
英語 post
ふりがな ぽすと
フリガナ ポスト

解説

ホームページに情報を送信するためのHTTPメソッド
HTTPを用いて、特定のURLに対して文字列や画像を送信し、その結果としてホームページや画像等を取得するために、リクエストとして送信するHTTPメソッド
 
"POST http://www.atmarkit.co.jp/misc/search/search.php HTTP/2.0"のような形式でソケットを用いて送信することで、情報を取得することができる。
送信する情報は「本文」として送信する。日本語を渡す場合にはURLEncoderクラスのencode()メソッドで適切な形式に変換する必要がある。ただしその形式は送信先によって異なる。
 
ホームページから送信する場合には、<FORM>タグを使用して入力フォームを形成し、<INPUT>タグを使用して入力用テキストボックスや送信ボタンを表示する。この送信ボタンが押された際に、各入力値が送信される。
通常、Webブラウザの「アドレス」欄から直接POSTすることはできない。
だが、それは「アドレス欄からできない」というだけで、上記のようにソケットを使用した例を含めて、いくらでも「好きな情報をPOSTする」ことができるため、Webアプリケーションは、フォームの形式に関わらず、あらゆる形式で情報が送られてくることを想定しなければならない。
それを怠った場合、セキュリティホールとなる可能性がある。
 
また、サーブレットでこのHTTPメソッドを受け取った場合、doPost()メソッドが呼ばれる。
 
「情報の送信」はGETでもえるが、その場合リクエストパラメーターとして渡す必要がある。
リクエストパラメーターとして渡すと、文字列の長さに制限があるため大きなデータを送信することができず、また、送信したリクエストパラメーターWebブラウザの「アドレス」欄に表示されてしまうため、セキュリティ的にも問題となる。
そのため、情報を送信する場合には通常POSTを使用することになる。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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.atmarkit.co.jp";
        // 接続時のポート番号。
        int port = 80;
        // Content-Typeの文字コード(注:実際には、送信元ページの文字コードを元に指定します)。
        String charSet = "EUC-JP";
        // リクエストのメソッド。
        String method = "POST";
        // リクエストURL。
        String url = "/misc/search/search.php";
        // リクエストのプロトコル。
        String protocol = "HTTP/1.1";
        // 「Host」リクエストヘッダー。
        String hostHeader = "Host:";
        // 「Content-Length」リクエストヘッダー。
        String contentLengthHeader = "Content-Length: ";
        // 「Content-Type」リクエストヘッダー。
        String contentTypeHeader = "Content-Type: application/x-www-form-urlencoded";
        // 送信するリクエストパラメーター。
        String param0 = "query=Java";

        // ソケットクラス。
        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 );

            // リクエストを送信します。
            System.out.println( method + " " + url + " " + protocol );
            System.out.println( hostHeader + host );
            System.out.println( contentTypeHeader );
            System.out.println( contentLengthHeader + param0.length() );
            System.out.println();
            System.out.println( param0 );
            System.out.println();
            System.out.flush();
            // POST /misc/search/search.php HTTP/1.1
            // Host:www.atmarkit.co.jp
            // Content-Type: application/x-www-form-urlencoded
            // Content-Length: 10
            // (改行のみ)
            // query=Java
            // (改行のみ)

            // 注:送信するパラメーターは「本文」に当たるので、
            // リクエストヘッダーの間に空行を挟みます。
            // また、日本語を渡す場合にはURLEncoderクラスのencode()メソッドで
            // 特別な形にエンコードする必要があります。ただし、その形式は送る
            // 相手で異なります。

            printWriter.println( method + " " + url + " " + protocol );
            printWriter.println( hostHeader + host );
            printWriter.println( contentTypeHeader );
            printWriter.println( contentLengthHeader + param0.length() );
            printWriter.println();
            printWriter.println( param0 );
            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 13:04:46 GMT
            //Server: Apache/1.3.28 (Unix) tomcat/1.0 mod_ssl/2.8.15 OpenSSL/0.9.7c PHP/4.3.10
            //Set-Cookie: Apache=219.117.192.192.292101124975086913; path=/; expires=Wed, 20-Aug-25 13:04:46 GMT
            //P3P: CP="CAO DSP COR CURa ADMa DEVa OUR IND NAV "
            //X-Powered-By: PHP/4.3.10
            //Cache-Control: private
            //Transfer-Encoding: chunked
            //Content-Type: text/html; charset=EUC-JP
            //
            //d23
            //<HTML lang="ja">
            //<HEAD>
            //<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
            //<TITLE>@IT総合検索 - 「Java」の検索結果</TITLE><link rel="stylesheet" href="/stylesheet/article.css" type="text/css">
            // (以下略)
        }
        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.atmarkit.co.jp";
        // 接続時のポート番号。
        int port = 80;
        // Content-Typeの文字コード(注:実際には、送信元ページの文字コードを元に指定します)。
        String charSet = "EUC-JP";
        // リクエストのメソッド。
        String method = "POST";
        // リクエストURL。
        String url = "/misc/search/search.php";
        // リクエストのプロトコル。
        String protocol = "HTTP/1.1";
        // 「Host」リクエストヘッダー。
        String hostHeader = "Host:";
        // 「Content-Length」リクエストヘッダー。
        String contentLengthHeader = "Content-Length: ";
        // 「Content-Type」リクエストヘッダー。
        String contentTypeHeader = "Content-Type: application/x-www-form-urlencoded";
        // 送信するリクエストパラメーター。
        String param0 = "query=Java";

        // ソケットクラス。
        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 );

            // リクエストを送信します。
            System.out.println( method + " " + url + " " + protocol );
            System.out.println( hostHeader + host );
            System.out.println( contentTypeHeader );
            System.out.println( contentLengthHeader + param0.length() );
            System.out.println();
            System.out.println( param0 );
            System.out.println();
            System.out.flush();
            // POST /misc/search/search.php HTTP/1.1
            // Host:www.atmarkit.co.jp
            // Content-Type: application/x-www-form-urlencoded
            // Content-Length: 10
            // (改行のみ)
            // query=Java
            // (改行のみ)

            // 注:送信するパラメーターは「本文」に当たるので、
            // リクエストヘッダーの間に空行を挟みます。
            // また、日本語を渡す場合にはURLEncoderクラスのencode()メソッドで
            // 特別な形にエンコードする必要があります。ただし、その形式は送る
            // 相手で異なります。

            printWriter.println( method + " " + url + " " + protocol );
            printWriter.println( hostHeader + host );
            printWriter.println( contentTypeHeader );
            printWriter.println( contentLengthHeader + param0.length() );
            printWriter.println();
            printWriter.println( param0 );
            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 13:04:46 GMT
            //Server: Apache/1.3.28 (Unix) tomcat/1.0 mod_ssl/2.8.15 OpenSSL/0.9.7c PHP/4.3.10
            //Set-Cookie: Apache=219.117.192.192.292101124975086913; path=/; expires=Wed, 20-Aug-25 13:04:46 GMT
            //P3P: CP="CAO DSP COR CURa ADMa DEVa OUR IND NAV "
            //X-Powered-By: PHP/4.3.10
            //Cache-Control: private
            //Transfer-Encoding: chunked
            //Content-Type: text/html; charset=EUC-JP
            //
            //d23
            //<HTML lang="ja">
            //<HEAD>
            //<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
            //<TITLE>@IT総合検索 - 「Java」の検索結果</TITLE><link rel="stylesheet" href="/stylesheet/article.css" type="text/css">
            // (以下略)
        }
        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();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/11
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。