HTTP Web サービス・クライアント・プロシージャを作成する場合は、この句を使用して、HTTP 要求ヘッダのエントリを追加、変更、または削除します。ヘッダの仕様は、RFC2616 Hypertext Transfer Protocol — HTTP/1.1 および RFC822 Standard for ARPA Internet Text Messages に非常に近いものになっています。たとえば、HTTP ヘッダに指定できるのは印字可能な ASCII 文字のみで、大文字と小文字は区別されません。HTTP ヘッダ仕様の重要な点を次に示します。
ヘッダ/値ペアは、\n または \x0d\n で区切ります。これは、それぞれ改行 (<LF>) または復帰と改行 (<CR><LF>) です。
ヘッダと値は、コロン (:) を使用して区切ります。このため、ヘッダにコロンは使用できません。
直後に :\n または行の最後があるヘッダは、値のないヘッダを指定します。直後にコロンまたは値のないヘッダも同様です。たとえば、HEADER 'Date'
は、Date ヘッダを含めないことを指定します。ヘッダや値を抑制すると、予期しない結果になる場合があります。HTTP ヘッダの修正を参照してください。
長いヘッダ値の折り返しがサポートされています。折り返すには、\n の直後に 1 つ以上のスペースが必要です。たとえば、次の HEADER 仕様とこれによる HTTP 出力は、セマンティック上は同じです。
HEADER 'heading1: This long value\n is a really long value for heading1\n heading2:shortvalue' |
HEADER 'heading1:This long value is a really long value for heading1<CR><LF> heading2:shortvalue<CR><LF>' |
連続する複数のスペースは、折り返しの場合も含めて、単一の空白文字として出力されます。
この句では、パラメータの代入がサポートされています。
次の例は、静的なユーザ定義ヘッダの追加方法を示しています。
CREATE PROCEDURE http_client() URL 'http://localhost/getdata' TYPE 'http:get' HEADER 'UserHeader1:value1\nUserHeader2:value2'; |
次の例は、代入パラメータを使用するユーザ定義ヘッダの追加方法を示しています。
CREATE PROCEDURE http_client( headers LONG VARCHAR ) URL 'http://localhost/getdata' TYPE 'http:get' HEADER '!headers'; CALL http_client( 'NewHeader1:value1\nNewHeader2:value2' ); |
HTTP 要求のヘッダは、NEXT_HTTP_HEADER 関数と HTTP_HEADER 関数を組み合わせて使用することによって取得できます。NEXT_HTTP_HEADER 関数は、要求に含まれる HTTP ヘッダに対して反復され、次の HTTP ヘッダ名を返します。NULL を指定して呼び出すと、最初のヘッダの名前が返されます。後続のヘッダは、関数に前のヘッダの名前を渡すことによって取得されます。最後のヘッダの名前を指定して呼び出すと、NULL が返されます。
この関数を繰り返し呼び出すと、すべてのヘッダ・フィールドが一度だけ返されます。ただし、必ずしも HTTP 要求での表示順に表示されるとはかぎりません。
HTTP_HEADER 関数は、名前付きの HTTP ヘッダ・フィールドの値を返します。HTTP サービスから呼び出されていない場合は NULL を返します。Web サービスを介して HTTP 要求を処理する場合に使用します。指定したフィールド名のヘッダが存在しない場合、戻り値は NULL です。
次の表に、典型的な HTTP ヘッダと値の例を示します。
ヘッダ名 | ヘッダ値 |
---|---|
Accept | image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、application/x-shockwave-flash、application/vnd.ms-excel、application/vnd.ms-powerpoint、application/msword、*/* |
Accept-Language | en-us |
UA-CPU | x86 |
Accept-Encoding | gzip、deflate |
User-Agent | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; SV1; .NET CLR 2.0.50727) |
Host | localhost |
Connection | Keep-Alive |
@HttpMethod | GET |
@HttpURI | /demo/ShowHTTPHeaders |
@HttpVersion | HTTP/1.1 |
各ヘッダの値を取得するには、まず NEXT_HTTP_HEADER 関数を使用してヘッダ名を取得し、HTTP_HEADER 関数を使用してその値を取得します。次の例は、これを行う方法を示します。
CREATE PROCEDURE HTTPHeaderExample() RESULT ( html_string LONG VARCHAR ) BEGIN declare header_name long varchar; declare header_value long varchar; declare table_rows XML; set header_name = NULL; set table_rows = NULL; header_loop: LOOP SET header_name = NEXT_HTTP_HEADER( header_name ); IF header_name IS NULL THEN LEAVE header_loop END IF; SET header_value = HTTP_HEADER( header_name ); -- Format header name and value into an HTML table row SET table_rows = table_rows || XMLELEMENT( name "tr", XMLATTRIBUTES( 'left' AS "align", 'top' AS "valign" ), XMLELEMENT( name "td", header_name ), XMLELEMENT( name "td", header_value ) ); END LOOP; SELECT XMLELEMENT( name "table", XMLATTRIBUTES( '' AS "BORDER", '10' AS "CELLPADDING", '0' AS "CELLSPACING" ), XMLELEMENT( name "th", XMLATTRIBUTES( 'left' AS "align", 'top' AS "valign" ), 'Header Name' ), XMLELEMENT( name "th", XMLATTRIBUTES( 'left' AS "align", 'top' AS "valign" ), 'Header Value' ), table_rows ); END; |
この例では、ヘッダの名前と値を HTML テーブルとして出力します。このサンプル・プロシージャの動作を確認するには、次のサービスを定義します。
CREATE SERVICE ShowHTTPHeaders TYPE 'RAW' AUTHORIZATION OFF USER DBA AS CALL HTTPHeaderExample(); |
サービスをテストするには、Web ブラウザを開き、次の URL を指定します。
http://localhost:80/demo/ShowHTTPHeaders
処理中の要求のステータス・コード (または応答コード) を設定するには、特別なヘッダ @HttpStatus を使用します。sa_set_http_header システム・プロシージャを参照してください。
ヘッダ処理の詳細については、Web サービス関数を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |