前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设置和获取HTTP标头

设置和获取HTTP标头

作者头像
用户7741497
发布于 2022-06-09 05:49:53
发布于 2022-06-09 05:49:53
2.9K00
代码可运行
举报
文章被收录于专栏:hml_知识记录hml_知识记录
运行总次数:0
代码可运行

设置和获取HTTP标头

设置和获取HTTP标头

可以设置和获取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和其他实体标头。

ReturnHeaders()

返回包含此请求中的主HTTP标头的字符串。

OutputHeaders()

将主HTTP标头写入当前设备。

GetHeader()

返回此请求中设置的任何主HTTP标头的当前值。此方法接受一个参数,即头的名称(不区分大小写);这是一个字符串,如Host或Date

SetHeader()

设置标题的值。通常,可以使用它来设置非标准标头;大多数常用标头都是通过Date等属性设置的。此方法有两个参数:

  • 标头的名称(不区分大小写),不带冒号()分隔符;这是一个字符串,如Host或Date
  • 标头值

不能使用此方法设置实体标头或只读标头(Content-LengthConnection)。

管理保活(Keep-alive)行为

如果重复使用%Net.HttpRequest的同一实例来发送多个HTTP请求,则默认情况下,InterSystems IRIS会使TCP/IP套接字保持打开状态,这样InterSystems IRIS就不需要关闭并重新打开它。

如果不想重复使用TCP/IP套接字,请执行以下任一操作:

  • 设置SocketTimeout属性为0。
  • 在你的HTTP请求中添加'Connection: close' HTTP头。 要做到这一点,在发送请求之前添加如下代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set sc=http.SetHeader("Connection","close")

注意,每个请求之后都会清除HTTP请求头,因此需要在每个请求之前包含此代码。

%Net.HttpRequestSocketTimeout属性指定InterSystems IRIS将重用给定套接字的时间窗口(以秒为单位)。此超时旨在避免使用可能已被防火墙静默关闭的套接字。此属性的默认值为115。可以将其设置为不同的值。

处理HTTP请求参数

发送HTTP请求时(请参阅“发送HTTP请求”),可以在位置参数中包括参数;例如:"/test.html?PARAM=%25VALUE"PARAM设置为等于%value

还可以使用以下方法控制%Net.HttpRequest实例处理参数的方式:

InsertParam()

将参数插入到请求中。此方法接受两个字符串参数:参数的名称和参数的值。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 do req.InsertParam("arg1","1")

可以为给定参数插入多个值。如果这样做,这些值将接收从1开始的下标。在其他方法中,可以使用这些下标来引用目标值。

DeleteParam()

从请求中删除参数。第一个参数是参数的名称。第二个参数是要删除的值的下标;仅当请求包含同一参数的多个值时才使用此参数。

CountParam()

统计与给定参数关联的值数。

GetParam()

获取请求中给定参数的值。第一个参数是参数的名称。如果请求没有同名的参数,则第二个参数是要返回的默认值;该默认值的初始值为空值。第三个参数是要获取的值的下标;仅当请求包含同一参数的多个值时才使用此参数。

IsParamDefined()

检查是否定义了给定参数。如果参数有值,则此方法返回TRUE。参数与DeleteParam()相同。

NextParam()

通过$order()对参数名称进行排序后,检索下一个参数的名称(如果有)。

ReturnParams()

返回此请求中的参数列表。

包括请求正文

HTTP请求可以包括请求正文或表单数据。要包括请求正文,请执行以下操作:

  1. 创建%GlobalBinaryStream的实例或子类。将此实例用于HTTP请求的EntityBody属性。
  2. 使用标准流接口将数据写入此流。例如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Do oref.EntityBody.Write("Data into stream")

例如,可以读取一个文件并将其用作自定义HTTP请求的实体正文:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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会自动计算)。

要发送分块请求,请执行以下操作:

  1. 创建%Net.ChunkedWriter的子类,%Net.ChunkedWriter是定义以块形式写入数据的接口的抽象流类。在这个子类中,实现OutputStream()方法。
  2. %Net.HttpRequest的实例中,创建%Net.ChunkedWriter子类的实例,并用要发送的请求数据填充它。
  3. %Net.HttpRequest实例的EntityBody属性设置为等于此%Net.ChunkedWriter实例。

当发送HTTP请求时(请参见“发送HTTP请求”),它将调用EntityBody属性的OutputStream()方法。

%Net.ChunkedWriter的子类中,OutputStream()方法应该检查流数据,决定是否分块以及如何分块,并调用类的继承方法来编写输出。

有以下方法可用:

WriteSingleChunk()

接受字符串参数并将该字符串作为非分块输出写入。

WriteFirstChunk()

接受字符串参数。写入适当的Transfer-Encoding标题以指示分块的消息,然后将字符串作为第一个分块写入。

WriteChunk()

接受字符串参数并将字符串作为块写入。

WriteLastChunk()

接受字符串参数,并将字符串作为块写入,后跟零长度块以标记结尾。

如果非NULL,则TranslateTable属性指定用于在写入时转换每个字符串的转换表。前面的所有方法都检查此属性。

发送表单数据

HTTP请求可以包括请求正文或表单数据。要包括表单数据,请使用以下方法:

InsertFormData()

将表单数据插入到请求中。此方法接受两个字符串参数:表单项的名称和关联值。可以为给定表单项插入多个值。如果这样做,值将接收从1开始的下标。在其他方法中,可以使用这些下标来引用目标值

DeleteFormData()

从请求中删除表单数据。第一个参数是表单项的名称。第二个参数是要删除的值的下标;仅当请求包含同一表单项的多个值时才使用此参数。

CountFormData()

统计请求中与给定名称关联的值数。

IsFormDataDefined()

检查是否定义了给定的名称

NextFormData()

通过$order()对名称进行排序后,检索下一个表单项的名称(如果有)。

例1

插入表单数据后,通常调用Post()方法。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    Do httprequest.InsertFormData("element","value")
    Do httprequest.Post("/cgi-bin/script.CGI")

例2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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

插入、列出和删除Cookie

%Net.HttpRequest自动管理从服务器发送的Cookie;如果服务器发送Cookie%Net.HttpRequest实例将在下一次请求时返回此Cookie。(要使此机制正常工作需要重用%Net.HttpRequest的同一实例。)

使用以下方法管理%Net.HttpRequest实例中的Cookie

InsertCookie()

Cookie插入到请求中。指定以下参数:

  • Cookie的名称。
  • Cookie的值。
  • 应存储Cookie的路径。
  • 要从中下载Cookie的计算机的名称。
  • Cookie过期的日期和时间。

GetFullCookieList()

返回Cookie的数量,并(通过引用)返回Cookie数组。

DeleteCookie()

请记住,Cookie是特定于HTTP服务器的。当插入Cookie时,使用的是到特定服务器的连接,而该Cookie在其他服务器上不可用。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python 终极篇 --- django
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
py3study
2020/01/19
1.8K0
python 终极篇 --- django
TCP/IP协议族(二) HTTP报文头解析
本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述。下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每个值之间有逗号分隔。如果该值需要优先级,那么在值的后方跟上优先级q=0.8(q的值由0~1,优先级从低到高)。值与优先级中间由分号相隔。 头部字段名:值1, 值2;q=0.8 下方就是截取的网络请求中Request Headers的部分内容。红框中的Accept-Language就是头部字段名,冒号后边就是
lizelu
2018/01/11
1.4K0
TCP/IP协议族(二) HTTP报文头解析
爬虫系列(14)Scrapy 框架-模拟登录-Request、Response。
通常,Request对象在爬虫程序中生成并传递到系统,直到它们到达下载程序,后者执行请求并返回一个Response对象,该对象返回到发出请求的爬虫程序。
野原测试开发
2019/07/10
1.7K0
爬虫系列(14)Scrapy 框架-模拟登录-Request、Response。
面试 HTTP ,99% 的面试官都爱问这些问题
HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
cxuan
2020/04/21
1.5K0
面试 HTTP ,99% 的面试官都爱问这些问题
Django模板语言与视图(view)
  的命名包括任何字母数字以及下划线 ("_")的组合(不提倡数字开头)。 变量名称中
py3study
2020/01/19
3.6K0
Django模板语言与视图(view)
发送HTTP请求
可以创建%Net.HttpRequest的实例来发送各种HTTP请求并接收响应。此对象相当于Web浏览器,可以使用它发出多个请求。它会自动发送正确的cookie,并根据需要设置Referer标头。
用户7741497
2022/06/09
1.6K0
【愚公系列】2022年01月 Python教学课程 46-Django框架之HttpRequest
与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
愚公搬代码
2022/12/01
1.1K0
【愚公系列】2022年01月 Python教学课程 46-Django框架之HttpRequest
前后端数据交互(四)——fetch 请求详解
fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同的是,fetch 方式使用 Promise,相比 XMLHttpRequest 更加简洁。所以我们告别XMLHttpRequest,引入 fetch 如何使用?
呆呆
2021/09/30
5.2K0
网络编程之HTTP header请求头详解
(3)HTTP/1.1: URI(Uniform Resource Identifier,统一资源标识符)及其版本
lyb-geek
2018/07/26
1.9K0
Django之views系统
Django的View(视图)简介 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。 一
人生不如戏
2018/04/12
2.4K0
Django之views系统
Django学习笔记之Django视图View
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。 一个简单的视图 下面是一个以HTML文
Jetpropelledsnake21
2018/07/04
2K0
【Tomcat】《How Tomcat Works》英文版GPT翻译(第三章)
As mentioned in Introduction, there are two main modules in Catalina: the connector and the container. In this chapter you will enhance the applications in Chapter 2 by writing a connector that creates better request and response objects. A connector compliant with Servlet 2.3 and 2.4 specifications must create instances of javax.servlet.http.HttpServletRequest and javax.servlet.http.HttpServletResponse to be passed to the invoked servlet's service method. In Chapter 2 the servlet containers could only run servlets that implement javax.servlet.Servlet and passed instances of javax.servlet.ServletRequest and javax.servlet.ServletResponse to the service method. Because the connector does not know the type of the servlet (i.e. whether it implements javax.servlet.Servlet, extends javax.servlet.GenericServlet, or extends javax.servlet.http.HttpServlet), the connector must always provide instances of HttpServletRequest and HttpServletResponse.
阿东
2024/01/08
3090
【Tomcat】《How Tomcat Works》英文版GPT翻译(第三章)
Django请求和响应对象
当一个页面被请求时,Django 会创建一个 HttpRequest 对象,这个对象包含了请求的元数据。然后,Django 加载相应的视图,将 HttpRequest 作为视图函数的第一个参数。每个视图负责返回一个 HttpResponse 对象。
zy010101
2021/11/01
1.8K0
HTTP headers
HTTP标头使客户端和服务器可以通过HTTP请求或响应传递其他信息。HTTP标头由不区分大小写的名称,后跟冒号(:)和值组成。 值之前的空格将被忽略。
黑伞安全
2019/10/16
8.1K2
发送HTTP请求
发出HTTP POST请求。使用此方法可将数据(如表单结果)发送到Web服务器,或上载文件。有关示例,请参阅“发送表单数据”。
用户7741497
2022/06/09
2.5K0
Java 编程问题:十三、HTTP 客户端和 WebSocket API
本章包括 20 个问题,旨在介绍 HTTP 客户端和 WebSocket API。
ApacheCN_飞龙
2022/07/11
7K0
认识ASP.NET MVC的5种AuthorizationFilter
在总体介绍了筛选器及其提供机制(《深入探讨ASP.NET MVC的筛选器》)之后,我们按照执行的先后顺序对四种不同的筛选器进行单独介绍,首先来介绍最先执行的AuthorizationFilter。从命名来看,AuthorizationFilter用于完成授权相关的工作,所以它应该在Action方法被调用之前执行才能起到授权的作用。不仅限于授权,如果我们希望目标Action方法被调用之前中断执行的流程“做点什么”,都可以以AuthorizationFilter的形式来实现。[本文已经同步到《How ASP.N
蒋金楠
2018/01/15
1.6K0
认识ASP.NET MVC的5种AuthorizationFilter
package http
要管理代理、TLS配置、keep-alive、压缩和其他设置,创建一个Transport:
李海彬
2018/07/26
4.1K0
package http
AJAX基础知识与简单的操作示例
AJAX代表异步的 JavaScript 和 XML。简而言之,就是使用XMLHttpRequest对象与服务器端通信的脚本语言。它可以发送和接收各种格式的信息,包括JSON,XML,HTML和文本文件。AJAX最吸引人的特点是其“异步”特性,这意味着它可以与服务器通信,交换数据和更新页面,而不必刷新页面。
海拥
2021/08/23
1.8K0
HTTP协议
应用层(Application layer)是OSI模型的第七层。应用层直接和应用程序接口并提供常见的网络应用服务。应用层也向表示层发出请求。应用层是开放系统的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层。
梨_萍
2023/09/19
5210
HTTP协议
相关推荐
python 终极篇 --- django
更多 >
LV.8
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验