如何通过Postman模拟cURL请求

19

我正在使用以下 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 请求,并将以下内容作为标头发送:

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();
});

请帮助我纠正这些错误。

2个回答

51
使用cURL时,-u option(或--user)用于提供HTTP基本身份验证的凭据。这将设置Authorization头以包含与服务器进行身份验证所需的必要数据
这些步骤适用于Postman的打包应用程序。要使用旧版应用程序的步骤,请查看此答案的修订版本
要像在cURL命令中一样使用HTTP基本身份验证,请单击Authorization选项卡并输入您的凭据。单击Update Request将为您添加必要的Authorization头。

Postman's Authorization tab


Postman's Headers tab


为了以与cURL相同的方式提交JSON数据,请使用POST请求,在Body选项卡下选择raw,并输入您的数据,如下所示:

Postman's Body tab


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

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

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

现在请求通过 Fiddler 进行,我可以从会话列表中选择它,并使用“原始”检查器查看原始请求:

Fiddler's "raw" inspector


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

var_dump output


在数据结尾处添加一个=(如下所示:{"jsonrpc": "2.0", "method": "feed.list", "id": 1}=),var_dump将产生以下结果:

var_dump output


然而,在您的情况下,JsonRPC似乎会使用file_get_contents('php://input')。这将返回随请求提交的数据,包括=(如果数据以它结尾)。因为它将尝试将输入数据解析为JSON字符串,如果字符串以=结尾,它将失败,因为那是无效的JSON。
使用Chrome的FoxyProxy扩展程序,我为Fiddler创建了一个代理配置(127.0.0.1:8888),这使我可以轻松调试Postman的POST请求发送的数据。使用x-www-form-urlencoded作为foo键,没有值,实际发送的数据是foo=,这将导致您的JSON字符串无效。
然而,使用“原始”输入将允许发送指定的数据,而不添加=到其末尾,从而确保数据是有效的JSON。

@user2198400 我更新了我的答案,回答了你关于使用“原始”数据的问题。我不知道如何进行UTF-8响应。你可能需要提一个新问题来询问这个。 - Spooky
PAM认证怎么样?我正在尝试模拟以下curl命令:curl --no-check-certificate https://localhost:8000/login \ -d username=myusername \ -d password=mypassword \ -d eauth='pam'我已经将它们作为参数添加了,但不起作用。 - Mostafa Hussein

1
Curl默认使用HTTP基本身份验证。您在Postman中设置的标头与此不同。请尝试在Postman中使用基本身份验证。它在顶部面板中,您填写用户名和密码,授权标头将被生成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接