允许一个 Web 服务来为进程控制设置一个 HTTP 选项。
sa_set_http_option( optname, val )
optname 使用此 CHAR(128) 参数指定一个字符串,该字符串包含其中一个 HTTP 选项的名称。
val 使用此 LONG VARCHAR 参数指定应为指定选项设置的值。
在处理 Web 服务的语句或过程中使用此过程设置选项。
所支持的选项为:
CharsetConversion 使用此选项控制是否自动将结果集从数据库的字符集编码转换为客户端的字符集编码。其值只允许为 ON 和 OFF。缺省值为 ON。请参见字符集转换注意事项。
AcceptCharset 使用此选项指定用于响应字符集编码的 Web 服务器的首选项。可以按首选项的顺序指定一个或多个字符集编码。此选项的语法符合 RFC2616 超文本传输协议 (Hypertext Transfer Protocol) 中用于 HTTP Accept-Charset 请求标头字段说明的语法。
HTTP 客户端(例如 Web 浏览器)可以提供 Accept-Charset 请求标头,该标头指定按首选项排序的字符集编码的列表。可以选择为每个编码提供一个相关联的质量值 (q=qvalue),该值代表针对该编码的客户端首选项。缺省情况下,质量值为 1 (q=1)。下面是一个示例:
Accept-Charset: iso-8859-5, utf-8;q=0.8 |
AcceptCharset HTTP 选项值中的加号 (+) 可用作表示当前数据库字符集编码的快捷方式。加号也表示如果客户端还指定了其列表中的编码,则无论客户端分配什么样的质量值,该数据库字符集编码都具有优先级。
AcceptCharset HTTP 选项中的星号 (*) 可用于表示当客户端和服务器没有交叉列表时,只要服务器支持,Web 服务就应该使用客户端首选的字符集编码。
发送响应时,会使用客户端和 Web 服务都首选的第一个字符集编码。客户端的首选项顺序具有更高的优先级。如果不存在互斥的编码首选项,则使用 Web 服务首选的编码(除非 Web 服务列表中出现星号 (*),在这种情况下将使用客户端首选的编码)。
如果不使用 AcceptCharset HTTP 选项,则使用由客户端指定且服务器支持的首选字符集编码。如果客户端指定的编码都不受支持(或者客户端未发送 Accept-Charset 请求标头),则使用数据库字符集编码。
如果客户端未发送 Accept-Charset 标头,则会执行下列操作之一:
如果未指定 AcceptCharset HTTP 选项,则 Web 服务器将使用数据库字符集编码。
如果已指定 AcceptCharset HTTP 选项,则 Web 服务器将使用其首选的字符集编码。
如果客户端发送 Accept-Charset 标头,则会执行下列操作之一:
如果未指定 AcceptCharset HTTP 选项,则 Web 服务器将尝试使用客户端的某个首选字符集编码,从首选的编码开始。如果 Web 服务器不支持客户端的任何首选编码,则会使用数据库字符集编码。
如果已指定 AcceptCharset HTTP 选项,则 Web 服务器将尝试使用双方都列出的第一个首选字符集编码,从客户端首选的编码开始。例如,如果客户端发送按首选项的顺序排列的 Accept-Charset 标头列表编码(iso-a、iso-b 和 iso-c),而 Web 服务器首选 iso-b,然后是 iso-a,最后是 iso-c,则会选择 iso-a。
Web client: iso-a, iso-b, iso-c Web server: iso-b, iso-a, iso-c |
如果两个列表的交叉部分为空,则使用 Web 服务器的第一个首选字符集。在以下示例中,将使用编码 iso-d。
Web client: iso-a, iso-b, iso-c Web server: iso-d, iso-e, iso-f |
如果 AcceptCharset HTTP 选项中包含星号 ('*'),则重点在于客户端选择的编码,最终会使用 iso-a。实质上,使用星号即保证两个列表的交叉部分不会为空。
最理想的情况是客户端和 Web 服务都使用数据库字符集编码,因为这样就无需字符集转换,并且可提高 Web 服务器的响应时间。
请注意,如果 CharsetConversion 选项设置为 OFF,则不会执行 AcceptCharset。
SessionID 使用此选项创建、删除或重命名 HTTP 会话。如果 Web 服务设置该选项以创建 HTTP 会话,但是会话在服务器重新启动后未予保留,则数据库连接仍然存在。如果已经在会话上下文内,该调用将为会话重命名新的会话 ID。当使用空值调用时,会在 Web 服务终止时删除该会话。
生成的会话密钥的长度不得超过 128 个字符,并且如果装载了多个数据库,则该密钥在数据库之间必须是唯一的。
有关 HTTP 会话的详细信息,请参见在 HTTP 服务器上管理 HTTP 会话。
SessionTimeout 使用此选项指定非活动期间 HTTP 会话持续的时间(以单位为分钟)。当 HTTP 请求使用给定会话时,会重置该超时期限。超过 SessionTimeout 时会自动删除会话。
无
无
以下示例演示使用 sa_set_http_option 指示 Web 服务的数据库字符集编码的首选项。指定 UTF-8 编码作为第二选择。星号 (*) 指示 Web 服务愿意使用客户端首选的字符集编码,只要 Web 服务器支持该编码即可。
CALL sa_set_http_option( 'AcceptCharset', '+,UTF-8,*'); |
以下示例演示使用 sa_set_http_option 正确识别 Web 服务所使用的字符编码。在此示例中,Web 服务器连接到 1251CYR 数据库,并准备好向任何 Web 浏览器提供包含西里尔语字母表的 HTML 文档。
CREATE PROCEDURE cyrillic_html() RESULT (html_doc XML) BEGIN DECLARE pos INT; DECLARE charset VARCHAR(30); CALL sa_set_http_option( 'AcceptCharset', 'iso-8859-5, utf-8' ); SET charset = CONNECTION_PROPERTY( 'CharSet' ); -- Change any IANA labels like ISO_8859-5:1988 -- to ISO_8859-5 for Firefox. SET pos = LOCATE( charset, ':' ); IF pos > 0 THEN SET charset = LEFT( charset, pos - 1 ); END IF; CALL sa_set_http_header( 'Content-Type', 'text/html; charset=' || charset ); SELECT '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">' || XMLCONCAT( XMLELEMENT('HTML', XMLELEMENT('HEAD', XMLELEMENT('TITLE', 'Cyrillic characters') ), XMLELEMENT('BODY', XMLELEMENT('H1', 'First 5 lowercase Russian letters'), XMLELEMENT('P', UNISTR('\u0430\u0431\u0432\u0433\u0434')) ) ) ); END; CREATE SERVICE cyrillic TYPE 'RAW' AUTHORIZATION OFF USER DBA AS CALL cyrillic_html(); |
要展示建立要使用的正确字符集编码的过程,可以考虑以下由 Web 浏览器(例如 Firefox)提供给 Web 服务的 Accept-Charset 标头。它表明浏览器首选 ISO-8859-1 和 UTF-8 编码,但可接受其它编码。
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 |
Web 服务不会接受 ISO-8859-1 字符集编码,因为要传输的页面包含西里尔语字符。如对 sa_set_http_option 的调用所示,Web 服务首选 ISO-8859-5 或 UTF-8 编码。在此示例中选择 UTF-8 编码,因为双方都接受该编码。数据库连接属性 'CharSet' 指示 Web 服务已选择哪种编码。sa_set_http_header 过程用于将 HTML 文档的编码指示给 Web 浏览器。
Content-Type: text/html; charset=UTF-8 |
如果 Web 浏览器不指定 Accept-Charset,则 Web 服务缺省使用其首选项 ISO-8859-5。sa_set_http_header 过程用于指示 HTML 文档的编码。
Content-Type: text/html; charset=ISO_8859-5 |
以下示例设置唯一的 HTTP 会话标识符:
DECLARE sessionid VARCHAR(30); DECLARE tm TIMESTAMP; SET tm = NOW(*); SET sessionid = 'MySessions_' || CONVERT( VARCHAR, SECONDS(tm)*1000 + DATEPART(millisecond,tm)); CALL sa_set_http_option('SessionID', sessionid); |
以下示例将 HTTP 会话的超时时间设置为 5 分钟:
CALL sa_set_http_option('SessionTimeout', '5'); |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |