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

时间:2015-02-15 18:13:34

标签: php curl

我正在使用以下对localhost的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 个答案:

答案 0 :(得分:34)

使用cURL时,-u option(或--user)用于提供HTTP Basic authentication的凭据。这会将Authorization标头设置为包含要与服务器进行身份验证的necessary data

这些步骤适用于Postman的packaged app。对于旧应用程序的步骤,请查看此答案的修订版this

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


Postman's Authorization tab


Postman's Headers tab


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


Postman's Body tab


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

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

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

现在请求通过Fiddler,我可以从会话列表中选择它,并使用" raw"检查员看到原始请求:


Fiddler's "raw" inspector


这表明cURL正在使用HTTP基本身份验证和POST内容发出application/x-www-form-urlencoded请求。此类数据通常由键和值组成,例如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)创建了一个代理配置,这使我能够轻松调试邮递员POST发送的数据请求。如果x-www-form-urlencoded的密钥为foo而没有值,则发送的数据实际为foo=,这会导致您的JSON字符串无效。

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

答案 1 :(得分:1)

Curl默认使用HTTP Basic身份验证。你在Postman中设置的标题是不同的。尝试在Postman中使用Basic Auth。它位于顶部面板中,您将填写用户名和密码,并生成授权标题。