在PHP中无法从CURL响应中获取BODY

k2arahey  于 2022-11-28  发布在  PHP
关注(0)|答案(3)|浏览(410)

我需要通过API获取PIN码,但无法获取端点响应的正文。该过程非常简单,不需要身份验证。只需在MAILTO字段中发送电子邮件,Web服务就会返回PIN,或者说找不到电子邮件。在下面的例子中,我只想接收Json。但我无法做到这一点。
然而,当我在Postman中测试端点时,它工作得很好,但是当我在PHP中测试时,甚至不能得到Postman本身生成的CURL。
下面是我使用的PHP代码。

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api-dev.meucliente.app.br/api/Login/sistema/forgot-pin?mailto=teste@verificando.com.br');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
$esposta = curl_exec($curl);
curl_close($curl);
header('Content-Type: application/json');
var_dump($esposta);
?>

上述脚本返回以下结果:

string(123) "HTTP/1.1 404 Not Found
Date: Thu, 24 Nov 2022 14:28:51 GMT
Content-Length: 0
Connection: keep-alive
Server: Kestrel

当我在Postman中测试同一个端点时,返回结果是正确的:

[
    {
        "Mensagem": "Email não foi encontrado!!",
        "InnerException": null
    }
]

无论谁帮助我,我都会非常感激。

p1tboqfb

p1tboqfb1#

如果你得到了正确的网址,你的代码应该工作得很好。
也就是说,请求是否应该是GET,这是很可能的。
你所说的你的回应,并不是回应。
它是响应标头,您之所以得到它,是因为您有以下选项:

curl_setopt($curl, CURLOPT_HEADER, true);

请求失败。
看一下响应头的第一行。
它返回的HTTP状态为404 Not Found
这不是有效的URL:https://api-dev.meucliente.app.br/
它在 Postman 中也不起作用。

xvw2m8pv

xvw2m8pv2#

您没有包含Postman设置,问题就在那里。实际上问题出在您的cURL请求中,它没有模仿Postman请求。默认情况下,cURL执行GET请求,但您所访问的API显然期望POST类型的请求,并简单地丢弃对该端点的所有不满足该期望的请求。如果您将Postman方法类型更改为GET并尝试执行请求,那么您也不会得到JSON返回,就像您在PHP代码中遇到的一样。
因此,如果这是您遇到的唯一问题,您还需要执行POST请求,只需添加:

curl_setopt($curl, CURLOPT_POST, true);

您的程式码,而且应该是好的:

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api-dev.meucliente.app.br/api/Login/sistema/forgot-pin?mailto=teste@verificando.com.br');

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_POST, true);
$esposta = curl_exec($curl);
curl_close($curl);
header('Content-Type: application/json');
var_dump($esposta);

它将返回预期的数据:

string(167) "HTTP/2 400
date: Fri, 25 Nov 2022 05:11:11 GMT
content-type: application/json
server: Kestrel

[{"Mensagem":"Email não foi encontrado!!","InnerException":null}]"

顺便说一句:行

header('Content-Type: application/json');

不正确。您没有输出纯JSON,而只是输出字符串(根据var_dump()),因此您应该删除它,或者删除curl_setopt($curl, CURLOPT_HEADER, true);并将var_dump()替换为纯echo。或者,如果您在浏览器中测试,则只需将header()替换为echo '<pre>';

ldfqzlk8

ldfqzlk83#

在PHP 8.0.22版本中,要在POST模型中的CURL请求中获取BODY,我还需要发送BODY,即使它是空的。
以下是有效的脚本:

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api-dev.meucliente.app.br/api/Login/sistema/forgot-pin?mailto=teste@verificando.com.br');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, "{}");
$esposta = curl_exec($curl);
curl_close($curl);
header('Content-Type: application/json');
echo $esposta;
?>

相关问题