如何使用邮递员将 cURL 请求刺激到请求

How to stimulate cURL request to a request using postman

我正在对本地主机使用以下运行良好的 cURL 请求:

curl -u admin:e4d4face52f2e3dc22b43b2145ed7c58ce66e26b384d73592c -d "{\"jsonrpc\": \"2.0\", \"method\": \"feed.list\", \"id\": 1}" http://localhost/minifluxR/jsonrpc.php

但是当我使用 Postman 而不是 cURL 发送相同的请求时,我得到:

{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error"}}

在 Postman 中,我使用了 GET 请求并发送了以下 headers:

url:http://localhost/minifluxR/jsonrpc.php
username:admin
api_token:e4d4face52f2e3dc22b43b2145ed7c58ce66e26b384d73592c
method: feed.list

以下是我要触发的PHP函数:

$server = new Server;

$server->authentication(array(
    \Model\Config\get('username') => \Model\Config\get('api_token')
));

// Get all feeds
$server->register('feed.list', function () {
    return Model\Feed\get_all();
});

请帮我改正这些错误。

Curl 默认使用 HTTP 基本身份验证。您在 Postman 中设置的 header 有所不同。尝试在 Postman 中使用 Basic Auth。它在顶部面板中,您填写用户名和密码并生成授权header。

使用 cURL 时,-u option (or --user) is used to supply the credentials for HTTP Basic authentication. This sets the Authorization header to contain the necessary data 向服务器进行身份验证。

这些步骤适用于 Postman packaged app. For steps for the legacy app, view this 修改此答案。

要像在 cURL 命令中一样使用 HTTP 基本身份验证,请单击 授权 选项卡并输入您的凭据。单击 更新请求 将为您添加必要的 Authorization header。




要以与使用 cURL 相同的方式提交 JSON 数据,请使用 POST 请求,select raw Body 选项卡,然后像这样输入您的数据:



为了调试这个,我使用了 Fiddler - 一个免费的网络调试代理。

我使用 cURL 的 --proxy 选项让它通过 Fiddler 发送请求,如下所示:

curl \
--proxy http://localhost:8888 \
-u foo:bar \
-d "{\"jsonrpc\": \"2.0\", \"method\": \"feed.list\", \"id\": 1}" \
http://localhost

现在请求通过 Fiddler,我可以从 session 列表中 select 它,并使用 "raw" 检查器查看原始请求:



这表明 cURL 正在发出一个 POST 带有 HTTP 基本身份验证和 application/x-www-form-urlencoded 内容的请求。这种类型的数据通常由键和值组成,例如 foo=bar&hoge=fuga。但是,此 cURL 请求提交的是一个没有值的键。调用 var_dump($_POST) 将产生以下结果:



在数据末尾使用 =(像这样:{"jsonrpc": "2.0", "method": "feed.list", "id": 1}=),var_dump 将产生以下结果:



但是,在您的情况下,JsonRPC 似乎将使用 file_get_contents('php://input')。此 returns 与请求一起提交的数据,包括 =,如果数据以它结尾。因为它将尝试将输入数据解析为 JSON 字符串,所以如果字符串以 = 结尾,它将失败,因为那将是无效的 JSON.

使用 Chrome 的 FoxyProxy 扩展,我为 Fiddler (127.0.0.1:8888) 创建了一个代理配置,这使我能够轻松调试 Postman [=15] 发送的数据=] 请求。使用 x-www-form-urlencoded 和没有值的 foo 键,发送的数据实际上是 foo=,这将导致您的 JSON 字符串无效。

但是,使用 "raw" 输入将允许发送指定的数据而无需在其末尾添加 =,从而确保数据有效 JSON。