探索 HTTP 请求语法
最后修改时间:2023 年 11 月 7 日本节介绍 HTTP 请求格式。有关发送 HTTP 请求和查看 HTTP 响应的更多信息,请参阅HTTP 客户端。
要在 PyCharm 代码编辑器中编写 HTTP 请求,请使用以下通用语法:
Method Request-URI HTTP-Version
Header-field: Header-value
Request-Body
在 HTTP 请求中使用注释
在请求中,任何行以
//
或开头,#
使其成为注释行。// A basic request GET http://example.com/a/
设置 HTTP 请求的名称
要在运行/调试配置、Search Everywhere和Run Anything中快速找到您的请求,您可以为其指定名称。
###
在请求上方的、# @name
或旁边键入名称# @name =
。
如果请求没有名称,PyCharm 将使用其在请求文件中的位置(例如 )#1
作为请求名称。如果请求文件包含多个具有相同名称的请求,PyCharm 会将请求位置编号附加到每个名称。这将使每个请求名称都是唯一的,以便您可以在“服务”工具窗口、运行/调试配置等中轻松找到所需的名称。
使用简短形式进行 GET 请求
对于GET请求,您可以省略请求方法,仅指定 URI。
// A basic request http://example.com/a/
将多个请求写入一个文件中
###
通过在请求下方键入分隔符来标记请求的结束。// A basic request http://example.com/a/ ###
在分隔符下方撰写另一个请求。
// A basic request http://example.com/a/ ### // A second request using the GET method http://example.com:8080/api/html/get?id=123&value=content
将长请求分成几行
缩进除第一行之外的所有查询字符串行。
// Using line breaks with indent GET http://example.com:8080 /api /html /get ?id=123 &value=content
提示
URL 部分的缩进大小在“设置”|“设置”中配置。编辑| 代码风格| HTTP 请求 | 制表符和缩进| URL 部分缩进。
如果 URL 由于查询字符串而太长,您可以使用专用上下文操作将每个查询参数放在新行中。将插入符号放在查询字符串部分,按(显示上下文操作),然后选择将查询参数放在单独的行上。AltEnter
前
GET https://example.com:8080/api/get/html?firstname=John&lastname=Doe&planet=Tatooine&town=Freetown后
GET https://example.com:8080/api/get/html?firstname=John&lastname=Doe&planet=Tatooine&town=Freetown笔记
您可以使用设置 |中的 HTTP 客户端代码样式强制查询参数的一致包装。编辑| 代码风格| HTTP 请求 | 包裹和支架| 查询参数换行。
同样,您可以使用 来格式化请求中的正文
Content-Type: application/x-www-form-urlencoded
。将插入符号放在正文处,按(显示上下文操作),然后选择将表单 urlencoded 参数放在单独的行上。AltEnter前
POST https://ijhttp-examples.jetbrains.com/postContent-Type: application/x-www-form-urlencodedkey1=value1&key2=value2&key3=value3&key4=value4&key5=value5后
POST https://ijhttp-examples.jetbrains.com/postContent-Type: application/x-www-form-urlencodedkey1 = value1 &key2 = value2 &key3 = value3 &key4 = value4 &key5 = value5要配置正文的环绕
x-www-form-urlencoded
,请使用设置| 编辑| 代码风格| HTTP 请求 | 包裹和支架| 表单 urlencoded 参数换行。要配置前后和=
之前的空格&
,请使用设置| 编辑| 代码风格| HTTP 请求 | 空格。
通过身份验证访问 Web 服务
// Basic authentication GET http://example.com Authorization: Basic username password ### // Digest authentication GET http://example.com Authorization: Digest username password
笔记
与其他 HTTP 请求元素类似,提供的
username
和password
可以通过环境变量进行参数化。
提供请求消息体
在请求内,在请求正文前面添加一个空行,然后执行以下操作之一:
在适当的位置键入请求正文:
// The request body is provided in place POST https://example.com:8080/api/html/post HTTP/1.1 Content-Type: application/json Cookie: key=first-value { "key" : "value", "list": [1, 2, 3] }
如果将Content-Type标头字段值设置为PyCharm 支持的语言之一,则相应的语言片段将自动注入到 HTTP 请求消息正文中。如果未指定Content-Type,您可以手动注入语言片段。
要从文件中读取请求正文,请键入符号
<
,后跟文件路径。// The request body is read from a file POST https://example.com:8080/api/html/post Content-Type: application/json < ./input.json
使用 multipart/form-data 内容类型
将请求的Content-Type设置为multipart/form-data。要将文件作为multipart/form-data消息的一部分发送,请
filename
在Content-Disposition标头中包含该参数。POST https://example.com/api/upload HTTP/1.1 Content-Type: multipart/form-data; boundary=boundary --boundary Content-Disposition: form-data; name="first"; filename="input.txt" // The 'input.txt' file will be uploaded < ./input.txt --boundary Content-Disposition: form-data; name="second"; filename="input-second.txt" // A temporary 'input-second.txt' file with the 'Text' content will be created and uploaded Text --boundary Content-Disposition: form-data; name="third"; // The 'input.txt' file contents will be sent as plain text. < ./input.txt --boundary--
提示
要加快创建多部分/表单数据请求的速度,请使用mptr live template。
禁用以下重定向
当 HTTP 请求重定向时(收到 3xx 状态码),将返回重定向的页面响应。在“服务”工具窗口中,您可以查看重定向的页面响应以及请求期间发生的所有重定向。
您可能想禁用以下重定向。在这种情况下,将返回实际的重定向响应标头(例如 301 或 302)。
在请求之前,添加带有
@no-redirect
标签的注释行。// @no-redirect example.com/status/301
如果您已有重定向请求,则可以单击“服务”工具窗口中列表旁边的“禁用”。这会将标签添加到初始请求中。Redirections
@no-redirect
禁止将请求保存到请求历史记录
如有必要,您可以阻止将请求保存到请求历史记录中。如果请求包含一些敏感数据并且您不想记录它,这会很有帮助。
在请求之前,添加带有
@no-log
标签的注释行。// @no-log GET example.com/api
禁止将收到的 cookie 保存到 cookie jar
如有必要,您可以阻止将收到的 cookie 保存到 cookies jar 中。这样您就可以避免手动从http-client.cookies文件中删除不需要的 cookie。
在请求之前,添加带有
@no-cookie-jar
标签的注释行。// @no-cookie-jar GET example.com/api
使用变量
在编写 HTTP 请求时,您可以使用变量对其元素进行参数化。变量可以保存请求的主机、端口和路径、查询参数或值、标头值或请求正文或外部文件中使用的任意值。
在请求中使用变量
将变量括在双花括号中,如下所示
{{variable}}
。
变量的名称可以包含字母、数字、下划线符号_
、连字符-
或点符号.
。
HTTP 客户端中有几种类型的变量:
环境变量在特殊环境文件中定义并可在任何.http文件中使用。
.http文件中定义的就地变量仅在同一文件中可用。
使用该方法在响应处理程序脚本中以编程方式定义的全局变量
client.global.set
。在请求之前使用该方法定义的每个请求变量
request.variables.set
仅在此请求中可用。具有动态生成值的内置动态变量。
环境变量
环境变量允许您在项目中存储一组环境定义。例如,您可以{{host}}
在不同的环境中创建变量,而不是在请求中显式提供主机名:开发环境中的本地主机名和生产环境中的公共主机名。然后,您可以使用当前.http文件编辑器顶部的运行方式列表来选择环境:
无环境:如果选择此选项,则在当前文件中运行请求时将不使用环境。如果您的请求不包含任何变量,请选择它。
环境名称(例如生产或开发):所选环境将用于当前文件中的所有请求,单击 时无需选择。如果您想在同一环境中运行多个请求并且不想在每次运行请求时都选择它,这会很有帮助。
<运行前选择环境>:选择此选项后,每次单击 时都必须选择一个环境。如果您经常切换环境并希望为每次运行显式选择它们以确保使用所需的环境执行请求,这会很方便。点击。
当查看请求结构、在浏览器中打开请求、执行请求以及为其创建运行/调试配置时,所选环境将用作默认环境。
定义环境变量
环境变量在环境文件中定义。
在请求编辑器面板顶部的运行方式列表中,选择要添加环境的位置:
如果您希望环境公开,请选择将环境添加到公共文件...。这会将环境添加到http-client.env.json文件中。该文件可以包含常见变量,例如主机名、端口或查询参数,并且应与您的项目一起分发。
如果您希望环境是私有的,请选择将环境添加到私有文件...。这会将环境添加到http-client.private.env.json文件中。该文件可能包含密码、令牌、证书和其他敏感信息。http-client.private.env.json文件中指定的变量值将覆盖公共环境文件中的值。
提示
如有必要,您可以手动创建这些文件。
使用所需的变量填充创建的文件。
以下示例http-client.env.json环境文件定义了两个环境:开发和生产。附加的http-client.private.env.json文件保存敏感授权数据。
http-client.env.jsonhttp-client.private.env.json{ "development": { "host": "localhost", "id-value": 12345, "username": "", "password": "", "my-var": "my-dev-value" }, "production": { "host": "example.com", "id-value": 6789, "username": "", "password": "", "my-var": "my-prod-value" } }
{ "development": { "username": "dev-user", "password": "dev-password" }, "production": { "username": "user", "password": "password" } }
HTTP请求示例如下:
GET http://{{host}}/api/json/get?id={{id-value}} Authorization: Basic {{username}} {{password}} Content-Type: application/json { "key": "{{my-var}}" }
在执行请求之前,PyCharm 允许您使用请求编辑器面板顶部的运行方式列表选择执行环境。
根据您的选择,生成的请求将是以下之一:
发展生产GET http://localhost/api/json/get?id=12345 Authorization: Basic dev-user dev-password Content-Type: application/json { "key": "my-dev-value" }
GET http://example.com/api/json/get?id=6789 Authorization: Basic user password Content-Type: application/json { "key": "my-prod-value" }
如果执行请求时变量未解析,PyCharm 会显示一条通知,让您快速创建、更新或选择不同的执行环境。
笔记
如果您在 IDEA 中使用 Git,则Git 不会跟踪http-client.private.env.json文件。但是,它不会添加到.gitignore文件中。如果您使用第三方工具或通过终端提交更改,则可能需要手动将http-client.private.env.json添加到.gitignore以避免共享机密信息:右键单击该文件并选择Git | 添加到 .gitignore。
管理多个环境文件
您的项目可能有多个目录,其中包含 HTTP 请求文件和相应的环境文件。在这种情况下,在为请求选择环境时可以使用以下部分:
对于文件显示存储在当前目录和父目录中的环境。
如果从此列表中选择一个环境,HTTP 客户端会尝试在当前目录中存储的文件(公共和私有)中查找它。如果此环境中没有文件,则会检查父目录。
来自整个项目显示存储在项目的所有其他位置(当前目录和父目录除外)的环境。如果这些目录中的文件包含与“对于文件”部分中的环境同名的环境,则该环境不会显示在列表中。
如果您希望环境在项目中随处可见,您可以为环境指定一个唯一的名称。
让我们用一个例子来说明这一点。假设您有以下项目结构:
root/http-client.env.json # public file with 'dev' environment and 'host' variable
root/service1/http-client.private.env.json # private file with 'dev' environment and "key": "myKey1" variable
root/service2/http-client.private.env.json # private file with 'dev' environment and "key": "myKey2" variable
当您选择环境时,.http
存储在目录中的文件将service1
使用变量myKey1
的值。存储在目录中的文件将使用该变量的值。key
dev
.http
service2
myKey2
key
如果私有文件包含host
变量,则.http
文件将使用其值,因为私有文件优先于公共文件。否则,他们将使用公共文件中的值。
就地变量
就地变量的范围是一个.http文件,它是在该文件中声明的。如果您想在同一文件内的多个请求中引用同一变量,请使用就地变量。
要创建就地变量,请@
在 HTTP 方法部分上方键入后跟变量名称。例如:
@myhost = example.org
GET {{myhost}}/users
###
GET {{myhost}}/stats
每个请求变量
您可以使用该request.variables.set(variableName, variableValue)
方法设置 HTTP 请求中使用的变量的值。将其写入封装在 HTTP 请求上方的预请求脚本中{% ... %}
。例如:
< {%
request.variables.set("firstname", "John")
%}
GET http://example.org/{{firstname}}
预请求脚本中定义的变量仅在该脚本后面的单个请求中可用。
使用初始化变量上下文操作 ( ) 快速添加就地变量或环境变量,或者初始化预请求处理程序脚本中的变量。AltEnter
在预请求脚本中,您还可以使用HTTP Client Crypto API基于加密哈希函数(例如 SHA-1、SHA-256、SHA-512、MD5)生成 HTTP 签名,并将它们作为变量传递给您的请求。例如:
< {%
const signature = crypto.hmac.sha256()
.withTextSecret(request.environment.get("secret")) // get variable from http-client.private.env.json
.updateWithText(request.body.tryGetSubstituted())
.digest().toHex();
request.variables.set("signature", signature)
const hash = crypto.sha256()
.updateWithText(request.body.tryGetSubstituted())
.digest().toHex();
request.variables.set("hash", hash)
%}
POST https://httpbin.org/post
X-My-Signature: {{signature}}
X-My-Hash: {{hash}}
Content-Type: application/json
动态变量
每次运行请求时,动态变量都会生成一个值。他们的名字开头是$
:
$uuid
或$random.uuid
:生成通用唯一标识符 (UUID-v4)$timestamp
:生成当前的UNIX时间戳$isoTimestamp
:生成 UTC 时区的 ISO-8601 格式的当前时间戳。$randomInt
:生成 0 到 1000 之间的随机整数。$random.integer(from, to)
from
:生成一个介于(含)和(不含)之间的随机整数to
,例如 random.integer(100, 500)。如果不提供任何参数,它将生成 0 到 1000 之间的随机整数。$random.float(from, to)
from
:生成一个介于(含)和(不含)之间的随机浮点数to
,例如 random.float(10.5, 20.3)。如果不提供任何参数,它将生成 0 到 1000 之间的随机浮点数。$random.alphabetic(length)
:生成长度为大写和小写字母的序列length
(必须大于0)。$random.alphanumeric(length)
:生成大小写字母、数字和下划线的长度序列length
(必须大于0)。$random.hexadecimal(length)
:生成一个随机长度的十六进制字符串length
(必须大于0)。$random.email
:生成一个随机电子邮件地址。$exampleServer
:替换为 PyCharm 内置 Web 服务器,只能使用 HTTP 客户端访问。该变量在 GraphQL 和 WebSocket示例中使用。
例如:
GET http://localhost/api/get?id={{$uuid}}
处理响应
您可以使用 JavaScript 处理响应。>
在请求后键入字符并指定 JavaScript 文件的路径和名称,或者将响应处理程序脚本代码封装在{% ... %}
.
GET https://httpbin.org/get
> /path/to/responseHandler.js
GET https://httpbin.org/get
> {%
client.global.set("my_cookie", response.headers.valuesOf("Set-Cookie")[0]);
%}
有关更多信息,请参阅HTTP 响应处理 API 参考。
重定向响应
您可以将响应重定向到文件。如果文件已存在,则用于>>
创建带有后缀的新文件;>>!
如果文件存在,则用于重写该文件。您可以指定绝对路径或相对于当前 HTTP 请求文件的路径。您还可以在路径中使用变量,包括环境变量和以下预定义变量:
{{$projectRoot}}
指向项目根目录{{$historyFolder}}
指向.idea/httpRequests/
以下示例 HTTP 请求在 HTTP 请求文件旁边的myFolder中创建myFile.json并将响应重定向到该文件。如果该文件已存在,则会创建myFile-1.json。
POST https://httpbin.org/post
Content-Type: application/json
{
"id": 999,
"value": "content"
}
>> myFolder/myFile.json
以下示例 HTTP 请求在.idea /httpRequests/中创建myFile.json。如果该文件已存在,则会覆盖该文件。它还使用驻留在项目根目录中的handler.js脚本处理响应。
POST https://httpbin.org/post
Content-Type: application/json
{
"id": 999,
"value": "content"
}
> {{$projectRoot}}/handler.js
>>! {{$historyFolder}}/myFile.json
笔记
对于 Windows,请使用反斜杠指定路径
\
。
感谢您的反馈意见!