0


IntelliJ IDEA 自带的 HTTP Client接口调用插件,替代 Postman

文章目录

引言

在日常的 Web 服务开发和调试中,我们经常需要对接口进行调用和测试。无论是在与团队内部协作开发时,还是在与第三方系统进行接口联调时,接口调用是不可或缺的一环。而在这个过程中,许多开发者会首选一款功能强大且易用的工具,其中最常见的就是

  1. Postman

—— 这是一款备受欢迎的接口调试工具,拥有丰富的功能和用户友好的界面。

然而,随着开发工具的不断演进,一些集成开发环境(IDE)也提供了强大的工具来简化和优化接口调用的过程。其中,

  1. IntelliJ IDEA

作为一款广泛使用的 Java 开发工具,自带了一个强大的 HTTP Client 接口调用插件,为开发者提供了一种替代

  1. Postman

的选择。

建议目录结构

  1. src
  2. main
  3. test
  4. http
  5. ├── AXXX.http # 调用A接口的文件
  6. ├── BXXX.http # 调用B接口的文件
  7. ├── http-client.env.json # 通用配置(接口地址等)
  8. ├── http-client.private.env.json # 私有配置(密码、Token等)

新建请求

  • 入口一:工具栏(idea顶上的一行工具里面)->Tools->HTTP Client。创建的是临时文件,不跟项目关联。

在这里插入图片描述

  • 入口二:点击接口旁边的这个图标,可以自动生成接口的url请求。创建的是临时文件,不跟项目关联。

  • 入口三:通过 cURL 创建请求,在xxx.http文件上,点击右上角的 Convert form cURL 按钮,然后输入 cURL 地址即可自动转换。

  • 入口四:可以在项目中测试目录(或者其他目录)下建一个http目录,右击New->HTTP Request,输入文件名称(.http结尾)即可创建。建议用这个,跟项目关联

从http请求跳转到接口层的代码

光标放在url上面,然后

  1. Ctrl + 鼠标左键

可以打开,可以从http请求跳转到接口层的代码。

请求结果

所有的请求结果,请求历史记录,cookies等信息会存放在

  1. .idea

文件夹下,如下:

不同环境的变量配置

在 Spring Boot 项目中,我们通常使用 Profile 机制来实现在不同环境中应用不同的配置文件。类似地,在 IntelliJ IDEA 中使用 HTTP Client 插件时,我们也可以借助类似的机制,以便在不同环境下轻松管理和切换配置。

首先,我们可以创建一个名为

  1. http-client.env.json

的配置文件,用于定义通用变量,例如 URL 地址、端口号等。这样一来,我们可以通过在不同环境中使用不同的配置文件,轻松地适应不同的场景需求。

  1. // http-client.env.json{"url":"https://api.example.com","port":8080,"commonHeader":"application/json"}

其次,为了安全起见,我们还可以创建一个名为

  1. http-client.private.env.json

的配置文件,专门用于存储敏感变量,例如用户名/密码、访问令牌等。请注意,由于这些信息属于敏感数据,我们强烈建议不要将

  1. http-client.private.env.json

提交到 Git 仓库中,以免泄露敏感信息。

  1. // http-client.private.env.json{"username":"your_username","password":"your_password","token":"your_access_token"}

最后,需要强调的是,确保将

  1. http-client.private.env.json

添加到项目的

  1. .gitignore

文件中,以防止不小心将敏感信息提交到版本控制系统中。

添加环境

可以设置不同环境的变量,比如dev、test、prod等。

在这里插入图片描述

http-client.env.json

  1. {"dev":{"host":"localhost","port":8080,"domain":"localhost:8080","cookie":"cookieDev"},"test":{"host":"baidu.test.com","port":8080,"domain":"baidu.test.com","cookie":"cookieSit"},"prod":{"host":"baidu.com","port":8080,"domain":"baidu.com","cookie":"cookieDevProd"}}

http-client.private.env.json

  1. {"dev":{"username":"","password":""},"test":{"username":"","password":""},"prod":{"username":"","password":""}}

引用变量

要引用这些定义变量,只需要使用{{}} 这个符号即可。比如引用domain ,可以用 {{domain}}。

引用的环境变量如下:

  1. POST http://{{domain}}/dangerWork/query
  2. Content-Type: application/json
  3. Cookie:{{cookie}}
  4. {
  5. "xxx": "xxx"
  6. }

运行时,自行选择运行环境。

请求示例

Get请求示例

  1. ### 带有头部的 GET 请求
  2. GET https://httpbin.org/ip
  3. Accept: application/json
  4. ### 带有参数的 GET 请求
  5. GET https://httpbin.org/get?show_env=1
  6. Accept: application/json
  7. ### 使用环境变量的 GET 请求
  8. GET {{host}}/get?show_env={{show_env}}
  9. Accept: application/json
  10. ### 禁用重定向的 GET 请求
  11. # @no-redirect
  12. GET http://httpbin.org/status/301
  13. ### 带有动态变量的 GET 请求
  14. GET http://httpbin.org/anything?id={{$uuid}}&ts={{$timestamp}}
  15. ### 禁止将请求保存到请求历史记录
  16. // @no-log
  17. GET example.com/api
  18. ### 禁止将收到的 cookie 保存到 cookie jar
  19. // @no-cookie-jar
  20. GET example.com/api
  21. ###

Post请求示例

  1. ### 第一行:POST请求,请求地址
  2. ### 第二 三行:请求头信息,多个请求头信息依次写下去(第三行、第四行……)
  3. ### 第N行:写具体的请求体,这里是JSON串,请求头和请求体之间要空出一行
  4. ### 多个请求间用 ### 分割
  5. ### 可以用 ptr 快捷提示 form表单是 ptrp
  6. ### 发送带有 JSON 主体的 POST 请求
  7. POST https://httpbin.org/post
  8. Content-Type: application/json
  9. {
  10. "id": 999,
  11. "value": "content"
  12. }
  13. ### 发送将主体作为参数的 POST 请求
  14. POST https://httpbin.org/post
  15. Content-Type: application/x-www-form-urlencoded
  16. id=999&value=content
  17. ### 发送包含文本和文件字段的表单
  18. POST https://httpbin.org/post
  19. Content-Type: multipart/form-data; boundary=WebAppBoundary
  20. --WebAppBoundary
  21. Content-Disposition: form-data; name="element-name"
  22. Content-Type: text/plain
  23. Name
  24. --WebAppBoundary
  25. Content-Disposition: form-data; name="data"; filename="data.json"
  26. Content-Type: application/json
  27. < ./request-form-data.json
  28. --WebAppBoundary--
  29. ### 发送带有请求主体中动态变量的请求
  30. POST https://httpbin.org/post
  31. Content-Type: application/json
  32. {
  33. "id": {{$uuid}},
  34. "price": {{$randomInt}},
  35. "ts": {{$timestamp}},
  36. "value": "content"
  37. }
  38. ###

鉴权示例

  1. ### 基本授权。
  2. GET https://httpbin.org/basic-auth/user/passwd
  3. Authorization: Basic user passwd
  4. ### 带有变量的基本授权。
  5. GET https://httpbin.org/basic-auth/user/passwd
  6. Authorization: Basic {{username}} {{password}}
  7. ### 摘要授权。
  8. GET https://httpbin.org/digest-auth/realm/user/passwd
  9. Authorization: Digest user passwd
  10. ### 带有变量的摘要授权。
  11. GET https://httpbin.org/digest-auth/realm/user/passwd
  12. Authorization: Digest {{username}} {{password}}
  13. ### 令牌授权,第 1 部分。检索并保存令牌。
  14. POST https://httpbin.org/post
  15. Content-Type: application/json
  16. {
  17. "token": "my-secret-token"
  18. }
  19. > {% client.global.set("auth_token", response.body.json.token); %}
  20. ### 令牌授权,第 2 部分。使用令牌进行授权。
  21. GET https://httpbin.org/headers
  22. Authorization: Bearer {{auth_token}}
  23. ###

断言示例

  1. ### 成功的测试:检查响应状态是否为 200
  2. GET https://httpbin.org/status/200
  3. > {%
  4. client.test("请求成功执行", function() {
  5. client.assert(response.status === 200, "响应状态不是 200");
  6. });
  7. %}
  8. ### 失败的测试:检查响应状态是否为 200
  9. GET https://httpbin.org/status/404
  10. > {%
  11. client.test("请求成功执行", function() {
  12. client.assert(response.status === 200, "响应状态不是 200");
  13. });
  14. %}
  15. ### 检查响应状态和内容类型
  16. GET https://httpbin.org/get
  17. > {%
  18. client.test("请求成功执行", function() {
  19. client.assert(response.status === 200, "响应状态不是 200");
  20. });
  21. client.test("响应内容类型为 JSON", function() {
  22. var type = response.contentType.mimeType;
  23. client.assert(type === "application/json", "期望 'application/json',但收到 '" + type + "'");
  24. });
  25. %}
  26. ### 检查响应主体
  27. GET https://httpbin.org/get
  28. > {%
  29. client.test("存在 Headers 选项", function() {
  30. client.assert(response.body.hasOwnProperty("headers"), "在响应中找不到 'headers' 选项");
  31. });
  32. %}
  33. ###

Websocket请求示例

  1. ### 简单的 WebSocket 请求
  2. // 可以直接从 Services 工具窗口向服务器发送消息
  3. WEBSOCKET ws://{{$exampleServer}}/ws
  4. ### 带有客户端消息的请求
  5. // 可以在请求体中指定客户端消息。使用 '===' 来分隔消息。
  6. // 在消息上方添加 '=== wait-for-server',以在收到服务器响应后发送消息。
  7. // 要等待 N 个响应,请添加 '=== wait-for-server' N 次。
  8. WEBSOCKET ws://{{$exampleServer}}/ws
  9. Content-Type: application/json // 我们使用它进行突出显示
  10. ===
  11. {
  12. "message": "你好,服务器!",
  13. "repeat": 3
  14. }
  15. === wait-for-server
  16. === wait-for-server
  17. {
  18. "message": "我们发送这条消息...",
  19. "repeat": 0
  20. }
  21. ===
  22. {
  23. "message": "和这条消息一起",
  24. "repeat": 1
  25. }
  26. ### 带有脚本的请求
  27. // 此外,我们还可以使用脚本向服务器发送消息并验证服务器的消息。
  28. WEBSOCKET ws://{{$exampleServer}}/ws
  29. Content-Type: application/json
  30. {
  31. "message": "开始的消息"
  32. }
  33. > {%
  34. var i = 0
  35. response.body.onEachMessage((message, unsubscribe, output) => {
  36. i++
  37. const jsonMessage = JSON.parse(message); // 我们知道我们的示例服务器返回 JSON
  38. client.test("服务器发送了一个带有 'message' 属性的 JSON:" + i , () => {
  39. client.assert(jsonMessage.message !== undefined)
  40. });
  41. if (jsonMessage.message.includes("finish")) {
  42. unsubscribe() // 移除当前的监听器
  43. return
  44. }
  45. if (i === 5) {
  46. output(JSON.stringify({
  47. message: "finish"
  48. }));
  49. } else {
  50. output(JSON.stringify({
  51. message: "脚本发送的消息:" + i
  52. }));
  53. }
  54. }, () => {
  55. client.log("我们停止了从当前 'onEachMessage' 调用中的 WebSocket 监听!")
  56. });
  57. %}

内置对象和动态变量

IntelliJ IDEA 的 HTTP Client 插件内置了一些对象和变量,以便在请求和脚本中执行动态操作。以下是一些常见的内置对象和变量:

内置对象:

每个请求变量

  1. < {%
  2. request.variables.set("firstname", "John")
  3. %}
  4. GET http://example.org/{{firstname}}

全局请求变量

  1. GET https://httpbin.org/get
  2. > {%
  3. client.global.set("my_cookie", response.headers.valuesOf("Set-Cookie")[0]);
  4. %}
  • request 对象
  • client 对象
  • crypto 对象

内置变量:

动态变量在每次运行请求时生成一个值。它们的名称以 $ 开头:

  • $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:被替换为IntelliJ IDEA内置的Web服务器,仅可通过HTTP Client访问。此变量用于GraphQL和WebSocket示例中。

例如:

GET http://localhost/api/get?id={{$uuid}}

这些变量和对象允许你在请求执行期间执行条件检查、日志记录和动态操作。


本文转载自: https://blog.csdn.net/abu935009066/article/details/134947426
版权归原作者 lakernote 所有, 如有侵权,请联系我们删除。

“IntelliJ IDEA 自带的 HTTP Client接口调用插件,替代 Postman”的评论:

还没有评论