如何将带有json数据负载的curl get请求转换为适合浏览器的线性URL字符串?

问题描述 投票:0回答:2

具体例子:

我从 PC 控制台向 12.34.56.78 的网络摄像头发送以下命令,它按预期工作(这会导致网络摄像头播放一些音频信号):

curl -X GET 'http://12.34.56.78/api.cgi?user=admin&password=123456' -d '[{"cmd":"AudioAlarmPlay","action":0,"param":{"channel": 0,"alarm_mode":"times","times":1}}]'

现在我想在可配置的客户端中使用此命令,以便在按下 GUI 上的某个按钮时发送此命令。

这个客户端应用程序是可配置的,因为我可以在文本配置文件中指定一个 URL 字符串(即文本格式的 http GET 命令),按下 GUI 按钮时将发送出去。

现在我应该在配置文件中写入什么字符串?!?

显然,curl 程序将在内部生成一些文本字符串,然后通过 http 协议将该文本字符串发送到节点 12.34.56.78(=我的网络摄像头)。但这到底是什么样子的呢?配置文件不理解curl,它只理解“线性”URL文本字符串。

希望我能说清楚,我希望有人能帮助我。

http curl url browser get
2个回答
0
投票

通过使用 -d 参数,您要求curl 发出 HTTP POST 请求。

目前无法通过浏览器地址栏发起HTTP POST请求。


0
投票

HTTP 简短回顾: HTTP 是OSI 模型 中应用层基于文本的通信协议。因此,它负责在非常抽象的级别上传输实际的用户数据。通信遵循请求-响应原则。服务器会为每个请求生成合适的响应,前提是该请求包含必要的信息。
显然,必须定义请求的目的地,这是通过全局唯一 ID(URI(统一资源标识符),在您的情况下更准确地说是 URL(统一资源定位符)来完成的。由于每个端点通常支持多个操作(例如检索和删除数据),因此还必须为每个请求指定HTTP 访问方法

您的情况:您正在使用cURL,HTTP 请求的客户端。该程序根据您的参数和一些技术细节创建您的请求并将其发送出去。

curl -X GET 'http://12.34.56.78/api.cgi?user=admin&password=123456' \
     -d '[{"cmd":"AudioAlarmPlay","action":0,"param":{"channel": 0,"alarm_mode":"times","times":1}}]'

让我们分解一下命令:

  1. -X GET
    定义 GET“传输目标资源的当前表示。”)作为我们的 HTTP 访问方法。
  2. http://12.34.56.78/api.cgi?user=admin&password=123456
    是目的地地址。此时应该注意,登录数据作为查询参数传递,这是一个灾难性的漏洞。您应该强烈考虑使用适当的 HTTP 身份验证机制
  3. -d ...
    定义请求正文,其中包含服务器完成请求所需的信息。

您的问题

这个客户端应用程序是可配置的,因为我可以在文本配置文件中指定一个 URL 字符串(即文本格式的 http GET 命令),按下 GUI 按钮时将发送出去。

如果您点击链接或在浏览器中输入该链接,则默认使用 GET 方法,因为根据规范,这不得调用服务器端的任何操作或更改(幂等性)。只需通过浏览器中的 URL 栏调用您的 URI 即可测试它是否有效。请注意,如果您这样做,则不会传输自定义用户数据(在调用操作时,通常使用 POST 等方法)。但是,这对应于您的应用程序中相同的现实情况。

现在我应该在配置文件中写入什么字符串?!?

显然,curl 程序会在内部生成一些文本字符串,然后通过 http 协议将该文本字符串发送到节点 12.34.56.78(=我的网络摄像头)。但这到底是什么样子的呢?配置文件不理解curl,它只理解“线性”URL文本字符串。

由于 HTTP 是一种文本协议,因此您假设此处生成文本是正确的。但不要将 URL(请求的一部分)与请求本身混淆。我们在这里讨论的是部分与整体的关系。您可以使用

-v
参数切换到详细输出,这看起来类似于:

> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.71.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Age: 44040
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Wed, 24 Apr 2024 07:58:43 GMT
< Etag: "3147526947"
< Expires: Wed, 01 May 2024 07:58:43 GMT
< Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
< Server: ECAcc (nyd/D121)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 1256
<

但毕竟:正如我上面所描述的,您正在尝试使用一小部分必要信息来执行完整的操作。您需要的不仅仅是 URL 信息来触发此操作(您已使用

-d
传递了所述数据)。

黑客解决方案

构建一个代理,您可以使用最少的信息来处理该代理,然后执行实际的请求。大致草图:

  1. 您按下按钮。应用程序调用
    http://mylocalhost/mediator
    ,无需任何有效负载数据。
  2. 中介者(位于
    http://mylocalhost/mediator
    )调用位于
    http://12.34.56.78/api.cgi
    的实际处理程序。由于这是一个单独的请求,因此可以根据您的喜好将其设置为复杂程度。
  3. 目标 (
    http://12.34.56.78/api.cgi
    ) 执行一些操作。
© www.soinside.com 2019 - 2024. All rights reserved.