【问题标题】:I need help converting a successful request from Postman into CURL commands using PHP (involves HTTPS and POST)我需要帮助使用 PHP 将来自 Postman 的成功请求转换为 CURL 命令(涉及 HTTPS 和 POST)
【发布时间】:2015-09-13 20:39:23
【问题描述】:

我尝试访问的端点需要 HTTPS 和基本身份验证。我的团队获得了一个 API 密钥,文档说明使用该密钥作为用户名,并将密码留空。

这是文档中的示例 CURL 请求:

curl -i -k -u '<api_key>': -XPOST --data-urlencode data@/path/to/test/file.json "https://<your_subdomain>.vendor.org/api/v1/assessments/import"; echo ""

当我使用 Chrome 的 Postman 扩展程序执行以下操作时,我得到了来自服务器的成功响应:

我正在尝试使用 PHP(XAMPP 安装)在本地执行此操作。以下是来自服务器的响应,说用户名/密码不正确:

function curlPost($url, $headers, $username, $password, $data) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_CAINFO, 'certificate.pem');
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	print_r(curl_exec($ch));
	// print_r(curl_getinfo($ch));
	// print_r(curl_error($ch));
	curl_close($ch);
}

$data = '{"key":"value", "key":"value"}';
curlPost('https://domain.com/api/data', ['Content-Type: application/xml'], 'api_key', '', $data);
{"success":false,"errors":["Email\/Username or password incorrect. Please try again."],"warnings":[],"info":[],"meta":[],"results":[]}

$data 中使用的 JSON 字符串是从成功的 Postman 请求中复制和粘贴的。

certificate.pem 与脚本位于同一文件夹中,并且已授予所有人读/写权限。我已尝试从我的机​​器上导出我们供应商站点的特定证书,以及在对this post 的顶部响应中链接的 CA 捆绑包。我能够使用它通过 PHP/CURL 成功访问供应商的 api-key-test 端点。

我对此很陌生。你介意帮我弄清楚我所缺少的吗?虽然我已经复制和粘贴了很多,但该功能主要是我自己的。 headers 的参数将用于其他事情。

【问题讨论】:

  • 这可能会对您有所帮助:stackoverflow.com/questions/28395/passing-post-values-with-curl - 本质上,根据您在 Postman 屏幕截图中选择的“form-data”,您需要传递 cURL 一个数组,而不是像您这样的编码字符串目前在$data
  • 没关系,这是另一回事。您的数据当前格式为 JSON。将 json_decode($data, true) 传递给 cURL 时执行一个 json_decode($data, true) 看看是否有效。
  • @StuartWagner Nope :( 仍然给我关于用户名/密码的错误。当我使用 Postman 发送无效对象时,我总是收到关于我发送的对象的错误消息。即使你是对的,我认为SSL 认证或基本身份验证存在更大的问题。我真的不想碰 php.ini。
  • 你是在同一个系统上运行这个吗?我很惊讶 Postman 能够通过您的身份验证,但您自己的代码却被卡住了。
  • 另外,请尝试在 auth 选项上方添加 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

标签: php ssl curl https postman


【解决方案1】:

带有 HTTP 授权标头的基本身份验证使用 Base64 编码值“用户名:密码”(不带双引号)

所以我假设在您的情况下,您需要对“yourApiKeyValue:”进行 Base64 编码,并将其放在 cURL 命令的授权标头中

MDN reference - HTTP Authentication

编辑:这也可能有帮助

How do I make a request using http basic authentication-with-php-curl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2017-06-22
    • 2014-04-12
    • 2017-05-25
    相关资源
    最近更新 更多