创建 HTTP Web 服务客户端过程时,此子句用于添加、修改或删除 HTTP 请求标头条目。标头说明与 RFC2616 超文本传输协议—HTTP/1.1 中指定的格式,以及用于 ARPA Internet 文本消息的 RFC822 标准极其相似,其中包括只能为 HTTP 标头指定可打印的 ASCII 字符,且这些字符不区分大小写这一事实。以下是关于 HTTP 标头说明的一些要点:
标头/值对可分别用 \n(指定换行 (<LF>))或 \x0d\n(指定回车和换行 (<CR><LF>))进行分隔。
由于标头与标头值之间是用冒号 (:) 分隔,因此标头中不能包含冒号。
标头后跟 :\n 或行尾时,指定一个不含任何值的标头,标头后不接冒号或值时,也是如此。例如,HEADER 'Date'
指定不应包含 Date 标头。取消标头或其值会引起意外的结果。请参见修改 HTTP 标头。
支持合并较长的标头值,但前提是在 \n 后紧跟一个或多个空格。例如,以下 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' ); |
可将 NEXT_HTTP_HEADER 和 HTTP_HEADER 函数结合使用来获得 HTTP 请求中的标头。NEXT_HTTP_HEADER 函数将遍历包含在请求中的 HTTP 标头并返回下一个 HTTP 标头名。如果用 NULL 调用该函数,该函数会返回第一个标头的名称。通过向该函数传递上一个标头的名称来检索后续的标头。当用最后一个标头的名称调用该函数时,该函数返回 NULL。
重复调用该函数将会返回所有的标头字段且刚好都只返回一次,但返回顺序不一定与它们在 HTTP 请求中出现的顺序相同。
HTTP_HEADER 函数将返回指定 HTTP 标头字段的值或 NULL(如果不是从 HTTP 服务调用)。当通过 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(兼容;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 |