我正在对运行良好的本地主机使用以下 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
请求并将以下内容作为 header 发送:
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 时,-u
option (或 --user
)用于为 HTTP Basic authentication 提供凭证.这会将 Authorization
header 设置为包含 necessary data向服务器进行身份验证。
这些步骤适用于 Postman 的 packaged app .有关旧版应用程序的步骤,请查看 this修改这个答案。
要像在 cURL 命令中那样使用 HTTP 基本身份验证,请单击 Authorization 选项卡并输入您的凭据。点击 Update Request 将为您添加必要的 Authorization
header 。
要以与使用 cURL 相同的方式提交 JSON 数据,请使用 POST
请求,在 Body 选项卡下选择 raw ,然后像这样输入您的数据:
为了调试这个,我使用了 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 列表中选择它,并使用“原始”检查器查看原始请求:
这向我展示了 cURL 正在使用 HTTP 基本身份验证和 application/x-www-form-urlencoded
内容发出 POST
请求。这种类型的数据通常由键和值组成,例如 foo=bar&hoge=fuga
。但是,此 cURL 请求提交的是一个没有值的键。调用 var_dump($_POST)
将产生以下结果:
数据末尾有一个=
(像这样:{"jsonrpc": "2.0", "method": "feed.list", "id": 1 }=
) var_dump
将产生以下内容:
但是,在您的情况下,JsonRPC 似乎将使用 file_get_contents('php://input')
。这将返回与请求一起提交的数据,如果数据以它结尾,则包括 =
。因为它将尝试将输入数据解析为 JSON 字符串,所以如果字符串以 =
结尾,它将失败,因为那将是无效的 JSON。
使用 FoxyProxy作为 Chrome 的扩展,我为 Fiddler (127.0.0.1:8888
) 创建了一个代理配置,这使我能够轻松调试 Postman 的 POST
请求发送的数据。使用 x-www-form-urlencoded
和没有值的 foo
键,发送的数据实际上是 foo=
,这将导致您的 JSON 字符串无效。
但是,使用“原始”输入将允许发送指定数据而无需在其末尾添加 =
,从而确保数据是有效的 JSON。
关于php - 如何使用 postman 将 cURL 请求刺激到请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529379/