Smart CODE
生成済みコードに関するオンラインガイド

名前
SendHandlerProc - Web サーバーにデータを POST (送信) する、または thin クライアントデータ交換を取り消す
概要
SendHandlerProc は、サーバーに送信されるデータに上書きできるようにするルーチンです。インターネット用スマートコードを使用している場合、このルーチンに何らかのデータを書き込むと、アクセスは強制的に GET 要求から POST 要求に変更されます。この結果、ユーザーのアプリケーションは、デフォルトのクライアントインタフェースが HTML 書式である WWW 上のデータサーバーと対話できるようになります。thin クライアント用スマートコードでこのスタブを使用した場合、このルーチンに書き込んだデータだけがサーバーに送信されます。
形式
C
#include "URL.h"

typedef int (*SendHandlerProc) ( URLConnection *,sc_stdcs_t *)
        URLConnection * uc;
        sc_stdcs_t * data;
C++
#include "URL.h"

typedef int (*SendHandlerProc)( URLConnection *, sc_stdcs_c*)
        URLConnection* uc;
        sc_stdcs_c * data;
Java
public class HANDLERNAME_c extends SCOutputDataHandler
{
        public void doit( SCStdCS csdata, OutputStream ostream)
        {}

        public static HANDLERNAME_c getNew_HANDLERNAME_c() {
                return new HANDLERNAME_c();
        }
}

入力
その他の注意
HANDLERNAME は、生成済みのコードでは、送信ハンドラルーチンに指定した名前に置き換えられます。
説明
照会フォーマット
送信ハンドラによって Web サーバーへのデータの POST が発生します。独自の書式処理プログラムを使用している場合を除き、標準のインタフェースからサーバープログラムに送信される照会のフォーマット、すなわち HTML 書式を理解する必要があります。

Web ブラウザは、FORM 要素を HTML 書式で取得し、テキストをコード化されたフォーマットに変換し、そのデータを<名前>=<値>の組み合わせとして送信します。<名前>は FORM 要素の名前タグに対応し、<値>はその設定およびデータに対応します。

Web ブラウザは、送信元、フォームの URL、およびその他の詳細を示すために、サーバーにコンテンツヘッダーも送信します。サーバーの中にはこの情報に注意を払い、たとえば、Netscape と Internet Explorer とでは異なる方法で応答するものもあります。高機能のサーバープログラムでは、認識できないクライアントに対しては応答を拒否する場合もあります。

デフォルトの HTML 書式インタフェースがサーバーと対話する方法を確認するには、接続をモニターするのが一番簡単です。次の java プログラムでは、送信された内容をエコーするだけの単純なサーバープログラムを実行します。フォームの「サブミット」ボタンを押したときに送信される内容を検出するには、次の処理を行います。
 

  • Web ブラウザにフォームを読み込みます
  • フォームに入力します
  • 次の java サーバープログラムを実行します - これは、ポート 2000 のローカルマシンで実行されます。
  • Web ブラウザの参照ページに移動し、HTTP proxy をローカルマシン、ポート 2000 に変更します
  • 「サブミット」を押します
  • java プログラムを実行している端末に、要求がエコーされます。次に、この例を示します。
  • $ javac Server.java
    $ java Server
    Listening on port 2000
    
    GET http://search.yahoo.co.uk/search/ukie?p=search+me&y=u HTTP/1.0
    Referer: http://www.yahoo.co.uk/
    Proxy-Connection: Keep-Alive
    User-Agent: Mozilla/4.05 [en] (X11; I; SunOS 5.5 sun4m)
    Host: search.yahoo.co.uk
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
    Accept-Language: en
    Accept-Charset: iso-8859-1,*,utf-8
    Cookie: INTERSE=192218887821987
  • ここで、ブラウザ (この時点で、発生する見込みのない応答を待っています) の「stop」ボタンを押し、proxy 参照を取り消します。

  • この例では、照会を URL に置き、GET メソッドを使用します。インターネット用スマートコードの「カスタマイズ」ダイアログの「URL 」フィールドの形式を関数に設定したり、適切な照会文字列を返す関数をプログラミングしても、これを模倣できます。このセクションでは、128 バイト以上の照会データになる可能性のあるフォームを対象としています。このデータは、POST メソッドによって処理され、コンテンツヘッダーに続いて出力ストリームに送信されます。

    次に、Java のモニタプログラムのコードを示します。これを Server.java という名前のファイルに保存し、コンパイルして実行します。

    import java.net.*;
    import java.io.*;
    
    public class Server extends Thread {
            ServerSocket ss = null;
    
            public Server() {
    
                    try {
                            ss = new ServerSocket(2000);
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    System.out.println("Listening on port 2000");
                    this.start();
            }
    
            public void run() {
                    try {
                            while(true) {
                                    Socket client = ss.accept();
                                    handleClient( client);
                            }
                    } catch (IOException e) {
                            System.out.println("Exception while listening for connection");
                    }
            }
    
            void handleClient( Socket s)
                    throws IOException
            {
                    DataInputStream in = new DataInputStream(s.getInputStream());
                    while (true) {
                            String line = in.readLine();
                            if (line == null)
                                    return;
                            System.out.println( line);
                    }
            }
    
            public static void main(String []args) {
                    Server s = new Server();
            }
    }
    要求ヘッダーを変更する
    この例では、URL 接続の setRequestProperty メソッドを使用して、さまざまな要求ヘッダー設定を変更します。Java API のほかに、C と C++ のバージョンを示します。例では、ヘッダーは Netscape ブラウザ (Mozilla) から入力されたように見えるように作られています。デフォルトでは、URL ライブラリは、独自のユーザー-エージェントシグニチャーを使って識別されます。

    要求ヘッダーを変更する
    言語 使用法
    C
    (*uc->setRequestProperty)( uc, "Referer", "http://www.ist.co.uk/cgi-bin/example-form");
    (*uc->setRequestProperty)( uc, "User-Agent", ""Mozilla/4.04 [en] (X11; I; SunOS 5.5 sun4m)");
    (*uc->setRequestProperty)( uc, "Accept", "*/*");
    (*uc->setRequestProperty)( uc, "Accept-Language", "en");
    (*uc->setRequestProperty)( uc, "Accept-Charset", "iso-8859-1,*,utf-8");
    (*uc->setRequestProperty)( uc, "Content-type", "application/x-www-form-urlencoded");
         
    C++
    uc->setRequestProperty( "Referer", "http://www.ist.co.uk/cgi-bin/example-form");
    uc->setRequestProperty( "User-Agent", ""Mozilla/4.04 [en] (X11; I; SunOS 5.5 sun4m)");
    uc->setRequestProperty( "Accept", "*/*");
    uc->setRequestProperty( "Accept-Language", "en");
    uc->setRequestProperty( "Accept-Charset", "iso-8859-1,*,utf-8");
    uc->setRequestProperty( "Content-type", "application/x-www-form-urlencoded");
         
    Java
    uc.setRequestProperty( "Referer", "http://www.ist.co.uk/cgi-bin/example-form");
    uc.setRequestProperty( "User-Agent", ""Mozilla/4.04 [en] (X11; I; SunOS 5.5 sun4m)");
    uc.setRequestProperty( "Accept", "*/*");
    uc.setRequestProperty( "Accept-Language", "en");
    uc.setRequestProperty( "Accept-Charset", "iso-8859-1,*,utf-8");
    uc.setRequestProperty( "Content-type", "application/x-www-form-urlencoded");
         

    要求タイプ
    Content-type プロパティだけは、必須プロパティとして認識されます。データが必ず標準の WWW 形式 URL エンコードでコード化されるようにするのは、プログラマの作業です。

    URL 接続の OutputStream
    接続の OutputStream にデータを送信する
    言語 使用法
    C
    OutputStream * o  = (*uc->getOutputStream)( uc);
    PrintWriter  * pw = newPrintWriter( o);
    
    (*pw->println)( pw, "firstname=Fred&secondname=Bloggs");
    (*pw->delete)( pw);
         
    C++
    OutputStream * o  = uc->getOutputStream();
    PrintWriter  * pw = new PrintWriter( o);
    
    pw->println("firstname=Fred&secondname=Bloggs");
    delete pw;
         
    Java
    OutputStream  o  = uc.getOutputStream();
    PrintWriter  pw  = new PrintWriter( o);
    
    pw.println("firstname=Fred&secondname=Bloggs");
         

    使用法


    Web サーバーにグループデータを POST する
    言語 使用法
    C
    int
    exampleSendHandler( uc, csdata)
            URLConnection * uc;
            sc_stdcs_t * csdata;
    {
            OutputStream * o;
            PrintWriter  * pw;
            MyGroup_t *   mygroup = (MyGroup_t*) csdata->group;
    
            char buf[128];
    
            (*uc->setRequestProperty)( uc,
                                    "Content-type",
                                    "application/x-www-form-urlencoded");
    
            o  = (*uc->getOutputStream)( uc);
            pw = newPrintWriter( o);
    
            (void) sprintf( buf, "selection=%s&toggle=%s",
                                    SC_GET(SelectionByName,mygroup->optionMenu1,
                                    SC_GET(State,mygroup->toggle1));
    
            (*pw->println)( pw, buf);
            (*pw->delete)( pw);
    
            return 1;
    }
         
    C++
    int
    exampleSendHandler( URLConnection * uc, sc_stdcs_c* csdata)
    {
            OutputStream * o;
            PrintWriter  * pw;
            MyGroup_c *    mygroup = (MyGroup_c*) csdata->getGroup();
    
            char buf[128];
    
            uc->setRequestProperty("Content-type",
                            "application/x-www-form-urlencoded");
    
            o  = uc->getOutputStream();
            pw = new PrintWriter( o);
    
            (void) sprintf( buf, "selection=%s&toggle=%s",
                                    mygroup->optionMenu1->getSelectionByName(),
                                    mygroup->toggle1->getState());
    
            pw->println(buf);
            delete pw;
    
            return 1;
    }
         
    Java
    public class exampleSendHandler_c extends SCOutputDataHandler
    {
            public void doit( URLConnection uc, SCStdCS csdata)
                    OutputStream o;
                    PrintWriter  pw; // 注: JDK 1.0 では PrintStream を使用する
                    MyGroup_c    mygroup = (MyGroup_c) csdata.getGroup();
    
                    uc.setRequestProperty("Content-type",
                                    "application/x-www-form-urlencoded");
    
                    o  = uc.getOutputStream();
                    pw = new PrintWriter( o);
    
                    String buf = "selection=" +
                                    mygroup.optionMenu1.getSelectionByName(),
                                 "&toggle=" +
                                    mygroup.toggle1.getState();
    
                    pw.println(buf);
            }
    }
         

    関連項目