可以设置和获取HTTP标头的值。
%Net.HttpRequest
的以下每个属性都包含具有相应名称的HTTP标头的值。如果不设置这些属性,则会自动计算它们:
Authorization
ContentEncoding
ContentLength
(此属性为只读。)ContentType
(指定Content-Type
标头的Internet媒体类型(MIME类型)。)ContentCharset
(指定Content-Type
标题的字符集部分。如果设置此属性,则必须首先设置ContentType
属性。)Date
From
IfModifiedSince
Pragma
ProxyAuthorization
Referer
UserAgent
%Net.HttpRequest
类提供可用于设置和获取主HTTP标头的常规方法。这些方法忽略Content-Type
和其他实体标头。
返回包含此请求中的主HTTP
标头的字符串。
将主HTTP
标头写入当前设备。
返回此请求中设置的任何主HTTP标头的当前值。此方法接受一个参数,即头的名称(不区分大小写);这是一个字符串,如Host或Date
设置标题的值。通常,可以使用它来设置非标准标头;大多数常用标头都是通过Date等属性设置的。此方法有两个参数:
:
)分隔符;这是一个字符串,如Host或Date不能使用此方法设置实体标头或只读标头(Content-Length
和Connection
)。
如果重复使用%Net.HttpRequest
的同一实例来发送多个HTTP请求,则默认情况下,InterSystems IRIS会使TCP/IP套接字保持打开状态,这样InterSystems IRIS就不需要关闭并重新打开它。
如果不想重复使用TCP/IP套接字,请执行以下任一操作:
SocketTimeout
属性为0。'Connection: close'
HTTP头。
要做到这一点,在发送请求之前添加如下代码:Set sc=http.SetHeader("Connection","close")
注意,每个请求之后都会清除HTTP请求头,因此需要在每个请求之前包含此代码。
%Net.HttpRequest
的SocketTimeout
属性指定InterSystems IRIS将重用给定套接字的时间窗口(以秒为单位)。此超时旨在避免使用可能已被防火墙静默关闭的套接字。此属性的默认值为115。可以将其设置为不同的值。
发送HTTP请求时(请参阅“发送HTTP请求”),可以在位置参数中包括参数;例如:"/test.html?PARAM=%25VALUE"
将PARAM
设置为等于%value
。
还可以使用以下方法控制%Net.HttpRequest
实例处理参数的方式:
将参数插入到请求中。此方法接受两个字符串参数:参数的名称和参数的值。例如:
do req.InsertParam("arg1","1")
可以为给定参数插入多个值。如果这样做,这些值将接收从1开始的下标。在其他方法中,可以使用这些下标来引用目标值。
从请求中删除参数。第一个参数是参数的名称。第二个参数是要删除的值的下标;仅当请求包含同一参数的多个值时才使用此参数。
统计与给定参数关联的值数。
获取请求中给定参数的值。第一个参数是参数的名称。如果请求没有同名的参数,则第二个参数是要返回的默认值;该默认值的初始值为空值。第三个参数是要获取的值的下标;仅当请求包含同一参数的多个值时才使用此参数。
检查是否定义了给定参数。如果参数有值,则此方法返回TRUE
。参数与DeleteParam()
相同。
通过$order()
对参数名称进行排序后,检索下一个参数的名称(如果有)。
返回此请求中的参数列表。
HTTP请求可以包括请求正文或表单数据。要包括请求正文,请执行以下操作:
%GlobalBinaryStream
的实例或子类。将此实例用于HTTP请求的EntityBody
属性。 Do oref.EntityBody.Write("Data into stream")
例如,可以读取一个文件并将其用作自定义HTTP请求的实体正文:
set file=##class(%File).%New("G:\customer\catalog.xml")
set status=file.Open("RS")
if $$$ISERR(status) do $System.Status.DisplayError(status)
set hr=##class(%Net.HttpRequest).%New()
do hr.EntityBody.CopyFrom(file)
do file.Close()
如果使用的是HTTP1.1,则可以分块发送HTTP请求。这涉及到设置Transfer-Encoding
以指示消息已分块,并使用大小为零的块来指示完成。
当服务器返回大量数据并且在完全处理请求之前不知道响应的总大小时,分块编码非常有用。在这种情况下,通常需要缓冲整个消息,直到可以计算出内容长度(%Net.HttpRequest
会自动计算)。
要发送分块请求,请执行以下操作:
%Net.ChunkedWriter
的子类,%Net.ChunkedWriter
是定义以块形式写入数据的接口的抽象流类。在这个子类中,实现OutputStream()
方法。%Net.HttpRequest
的实例中,创建%Net.ChunkedWriter
子类的实例,并用要发送的请求数据填充它。%Net.HttpRequest
实例的EntityBody
属性设置为等于此%Net.ChunkedWriter实
例。当发送HTTP请求时(请参见“发送HTTP请求”),它将调用EntityBody
属性的OutputStream()
方法。
在%Net.ChunkedWriter
的子类中,OutputStream()
方法应该检查流数据,决定是否分块以及如何分块,并调用类的继承方法来编写输出。
有以下方法可用:
接受字符串参数并将该字符串作为非分块输出写入。
接受字符串参数。写入适当的Transfer-Encoding
标题以指示分块的消息,然后将字符串作为第一个分块写入。
接受字符串参数并将字符串作为块写入。
接受字符串参数,并将字符串作为块写入,后跟零长度块以标记结尾。
如果非NULL,则TranslateTable
属性指定用于在写入时转换每个字符串的转换表。前面的所有方法都检查此属性。
HTTP请求可以包括请求正文或表单数据。要包括表单数据,请使用以下方法:
将表单数据插入到请求中。此方法接受两个字符串参数:表单项的名称和关联值。可以为给定表单项插入多个值。如果这样做,值将接收从1开始的下标。在其他方法中,可以使用这些下标来引用目标值
从请求中删除表单数据。第一个参数是表单项的名称。第二个参数是要删除的值的下标;仅当请求包含同一表单项的多个值时才使用此参数。
统计请求中与给定名称关联的值数。
检查是否定义了给定的名称
通过$order()
对名称进行排序后,检索下一个表单项的名称(如果有)。
例1
插入表单数据后,通常调用Post()
方法。例如:
Do httprequest.InsertFormData("element","value")
Do httprequest.Post("/cgi-bin/script.CGI")
例2
Set httprequest=##class(%Net.HttpRequest).%New()
set httprequest.SSLConfiguration="MySSLConfiguration"
set httprequest.Https=1
set httprequest.Server="myserver.com"
set httprequest.Port=443
Do httprequest.InsertFormData("portalid","2000000")
set tSc = httprequest.Post("/url-path/")
Quit httprequest.HttpResponse
%Net.HttpRequest
自动管理从服务器发送的Cookie
;如果服务器发送Cookie
,%Net.HttpRequest
实例将在下一次请求时返回此Cookie
。(要使此机制正常工作需要重用%Net.HttpRequest
的同一实例。)
使用以下方法管理%Net.HttpRequest
实例中的Cookie
:
将Cookie
插入到请求中。指定以下参数:
Cookie
的名称。Cookie
的值。Cookie
的路径。Cookie
的计算机的名称。Cookie
过期的日期和时间。返回Cookie
的数量,并(通过引用)返回Cookie
数组。
请记住,Cookie
是特定于HTTP服务器的。当插入Cookie
时,使用的是到特定服务器的连接,而该Cookie
在其他服务器上不可用。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。